TensorFlowモデルがあり、このモデルの一部が精度を評価します。 accuracy
は、テンソルフローグラフの別のノードであり、logits
とlabels
を取ります。
トレーニングの精度をプロットする場合、これは簡単です。次のようなものがあります。
tf.scalar_summary("Training Accuracy", accuracy)
tf.scalar_summary("SomethingElse", foo)
summary_op = tf.merge_all_summaries()
writer = tf.train.SummaryWriter('/me/mydir/', graph=sess.graph)
次に、トレーニングループの間に、次のようなものがあります。
for n in xrange(1000):
...
summary, ..., ... = sess.run([summary_op, ..., ...], feed_dict)
writer.add_summary(summary, n)
...
また、forループ内では、100回の繰り返しごとに、validation精度を評価したいと思います。これには別のfeed_dictがあり、Pythonで検証の精度を非常にうまく評価することができます。
しかし、ここに私の問題があります:accuracy
ノードを使用して、別の検証精度の概要を作成します。しかし、これを行う方法については明確ではありません。私はaccuracy
ノードを持っているので、再利用できるはずですが、これを正確に行う方法はわかりません。そのため、検証の精度を別のscalar_summaryとして書き出すこともできます。 ...
これはどのように可能でしょうか?
精度ノードは再利用できますが、トレーニング実行用とテストデータ用の2つの異なるSummaryWriterを使用する必要があります。また、正確性のためのスカラーサマリーを変数に割り当てる必要があります。
accuracy_summary = tf.scalar_summary("Training Accuracy", accuracy)
tf.scalar_summary("SomethingElse", foo)
summary_op = tf.merge_all_summaries()
summaries_dir = '/me/mydir/'
train_writer = tf.train.SummaryWriter(summaries_dir + '/train', sess.graph)
test_writer = tf.train.SummaryWriter(summaries_dir + '/test')
次に、トレーニングループで通常のトレーニングを行い、train_writerで概要を記録します。さらに、100回目の反復ごとにテストセットでグラフを実行し、test_writerで精度の概要のみを記録します。
# Record train set summaries, and train
summary, _ = sess.run([summary_op, train_step], feed_dict=...)
train_writer.add_summary(summary, n)
if n % 100 == 0: # Record summaries and test-set accuracy
summary, acc = sess.run([accuracy_summary, accuracy], feed_dict=...)
test_writer.add_summary(summary, n)
print('Accuracy at step %s: %s' % (n, acc))
次に、TensorBoardを親ディレクトリ(summaries_dir)にポイントすると、両方のデータセットがロードされます。
これは、TensorFlow HowToの https://www.tensorflow.org/versions/r0.11/how_tos/summaries_and_tensorboard/index.html にもあります。
同じ操作を実行し、異なるfeed_dictデータを含む要約を取得するには、そのopに2つの要約opを添付するだけです。検証データとテストデータの両方で精度操作を実行し、両方の概要を取得するとします。
validation_acc_summary = tf.summary.scalar('validation_accuracy', accuracy) # intended to run on validation set
test_acc_summary = tf.summary.scalar('test_accuracy', accuracy) # intended to run on test set
with tf.Session() as sess:
# do your thing
# ...
# accuracy op just needs labels y_ and input x to compute logits
validation_summary_str = sess.run(validation_acc_summary, feed_dict=feed_dict={x: mnist.validation.images,y_: mnist.validation.labels})
test_summary_str = sess.run(test_acc_summary, feed_dict={x: mnist.test.images,y_: mnist.test.labels})
# assuming you have a tf.summary.FileWriter setup
file_writer.add_summary(validation_summary_str)
file_writer.add_summary(test_summary_str)
また、 this のように、protobuff summary_strから常に生の(スカラー)データを引き出して、独自のロギングを実行できることも覚えておいてください。