web-dev-qa-db-ja.com

同じグラフを使用してTensorFlowでトレーニングと検証の精度を表示する

TensorFlowモデルがあり、このモデルの一部が精度を評価します。 accuracyは、テンソルフローグラフの別のノードであり、logitslabelsを取ります。

トレーニングの精度をプロットする場合、これは簡単です。次のようなものがあります。

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として書き出すこともできます。 ...

これはどのように可能でしょうか?

28
Spacey

精度ノードは再利用できますが、トレーニング実行用とテストデータ用の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 にもあります。

40
wih

同じ操作を実行し、異なる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から常に生の(スカラー)データを引き出して、独自のロギングを実行できることも覚えておいてください。

7
Yibo Yang