検証セットをnumpy配列として渡すことにより、skflowで検証モニターを使用しようとしています。
問題を再現するための簡単なコードを次に示します (Ubuntu/Linux 64 ビット、GPU 対応、Python 2.7 用に提供されたバイナリからテンソルフローをインストールしました)。
import numpy as np
from sklearn.cross_validation import train_test_split
from tensorflow.contrib import learn
import tensorflow as tf
import logging
logging.getLogger().setLevel(logging.INFO)
#Some fake data
N=200
X=np.array(range(N),dtype=np.float32)/(N/10)
X=X[:,np.newaxis]
Y=np.sin(X.squeeze())+np.random.normal(0, 0.5, N)
X_train, X_test, Y_train, Y_test = train_test_split(X, Y,
train_size=0.8,
test_size=0.2)
val_monitor = learn.monitors.ValidationMonitor(X_test, Y_test,early_stopping_rounds=200)
reg=learn.DNNRegressor(hidden_units=[10,10],activation_fn=tf.tanh,model_dir="tmp/")
reg.fit(X_train,Y_train,steps=5000,monitors=[val_monitor])
print "train error:", reg.evaluate(X_train, Y_train)
print "test error:", reg.evaluate(X_test, Y_test)
コードは実行されますが、最初の検証ステップのみが適切に実行されます。その後、トレーニングが実際にうまくいっている場合でも、検証は常に同じ値を返します。これは、最後にテスト セットで評価を実行することで確認できます。検証ステップごとに、次のメッセージも表示されます。
INFO:tensorflow:Input iterator is exhausted.
どんな助けでも大歓迎です!ありがとう、デビッド