TensorFlowにおけるバリデーション方法
TensorFlowにおけるバリデーションの方法がわかりません.
ここではIRISデータを学習することを考えます.
現在組んでいるプログラムは大まかに以下です.
import tensorflow as tf
labels = get_labels(dataset) #データ取得
data = get_data(dataset) #ラベル取得
train_data, test_data, valid_data = divide_data(data) #データ分割
train_labels, test_labels, valid_labels = divide_labels(labels) #ラベル分割
ph_data = tf.placeholder(tf.float32, shape=(None,4)) #データ用PlaceHolder
ph_labels = tf.placeholder(tf.float32, shape=(None,3)) #ラベル用PlaceHolder
#隠れ層のノード数
node_num = 1024
# 隠れ層定義
w_hidden = tf.Variable(tf.truncated_normal([4,node_num]))
b_hidden = tf.Variable(tf.zeros([node_num]))
f_hidden = tf.matmul(X, w_hidden) + b_hidden
hidden_layer = tf.nn.relu(f_hidden)
# 出力層定義
w_output = tf.Variable(tf.zeros([node_num,3]))
b_output = tf.Variable(tf.zeros([3]))
f_output = tf.matmul(hidden_layer, w_output) + b_output
out = tf.nn.softmax(f_output)
cross_entropy = t * tf.log(out) #交差エントロピー
loss = -tf.reduce_mean(cross_entropy) #誤差関数
optimizer = tf.train.AdamOptimizer() #最適化アルゴリズム
train_step = optimizer.minimize(loss) #lossを最小化
correct_pred = tf.equal(tf.argmax(out, 1), tf.argmax(ph_labels, 1)) #答え合わせ
accuracy = tf.reduce_mean(tf.cast(correct_pred, tf.float32)) #正解率
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
i = 0
for _ in range(2000):
i += 1
# トレーニング
sess.run(train_step, feed_dict={ph_data:train_data, ph_labels:train_labels})
# 200ステップごとに精度を出力
if i % 200 == 0:
# コストと精度を出力
train_loss, train_acc = sess.run([loss, accuracy], feed_dict={ph_data:test_data, ph_labels:test_labels})
print("Step: %d" % i)
print("[Train] cost: %f, acc: %f" % (train_loss, train_acc))
私の認識では,
sess.run(train_step, feed_dict={...})
でトレーニングを行い,
train_data
内での精度を見て,パラメータ調整をおこなっている(?)のではと思っております.
また同時に,train_loss, train_acc = sess.run(...)
は学習したモデルの損失と正解率を算出しているだけで,パラメータ調整には影響していないのかなと.
上記の場合,汎化能力や過学習への対応ができないため,「バリデーションを行うべき」と多く目にします.
しかし,valid_data
をどのように入力すればvalid_data
によるパラメータ調整ができるのかがわかりません.
不勉強で申し訳ないですが,どうかお願いします.