web-dev-qa-db-ja.com

テンソルボードでのトレーニングと検証の損失の記録

テンソルフローとテンソルボードの使用方法を学ぼうとしています。 MNISTニューラルネットチュートリアル に基づいたテストプロジェクトがあります。

私のコードでは、次のように、データセット内の正しく分類された桁の端数を計算するノードを作成します。

correct = tf.nn.in_top_k(self._logits, labels, 1)
correct = tf.to_float(correct)
accuracy = tf.reduce_mean(correct)

ここで、self._logitsはグラフの推論部分であり、labelsは正しいラベルを含むプレースホルダーです。

ここで、トレーニングが進行するにつれて、トレーニングセットと検証セットの両方の精度を評価したいと思います。これを行うには、異なるfeed_dictsで精度ノードを2回実行します。

train_acc = tf.run(accuracy, feed_dict={images : training_set.images, labels : training_set.labels})
valid_acc = tf.run(accuracy, feed_dict={images : validation_set.images, labels : validation_set.labels})

これは意図したとおりに機能します。値を印刷すると、最初は2つの精度が両方とも向上し、最終的には検証の精度が平坦化され、トレーニングの精度は向上し続けることがわかります。

ただし、これらの値のグラフをテンソルボードで取得したいので、これを行う方法がわかりません。 scalar_summaryaccuracyに追加するだけの場合、記録された値はトレーニングセットと検証セットを区別しません。

また、異なる名前の2つの同一のaccuracyノードを作成し、1つをトレーニングセットで、もう1つを検証セットで実行してみました。次に、これらの各ノードにscalar_summaryを追加します。これにより、テンソルボードに2つのグラフが表示されますが、トレーニングセットの精度を示す1つのグラフと検証セットの精度を示す1つのグラフの代わりに、どちらも端末に印刷されたものと一致しない同じ値を示しています。

私はおそらくこの問題を解決する方法を誤解しています。異なる入力に対して単一ノードからの出力を個別に記録する推奨方法は何ですか?

35
user3468216

これを実現する方法はいくつかありますが、異なる tf.summary.scalar() ノードを作成することで正しい軌道に乗っています。イベントファイルに数量を記録するたびに SummaryWriter.add_summary() を明示的に呼び出す必要があるため、おそらく最も簡単なアプローチは、取得するたびに適切なサマリーノードを取得することです。トレーニングまたは検証の精度:

_accuracy = tf.reduce_mean(correct)

training_summary = tf.summary.scalar("training_accuracy", accuracy)
validation_summary = tf.summary.scalar("validation_accuracy", accuracy)


summary_writer = tf.summary.FileWriter(...)

for step in xrange(NUM_STEPS):

  # Perform a training step....

  if step % LOG_PERIOD == 0:

    # To log training accuracy.
    train_acc, train_summ = sess.run(
        [accuracy, training_summary], 
        feed_dict={images : training_set.images, labels : training_set.labels})
    writer.add_summary(train_summ, step) 

    # To log validation accuracy.
    valid_acc, valid_summ = sess.run(
        [accuracy, validation_summary],
        feed_dict={images : validation_set.images, labels : validation_set.labels})
    writer.add_summary(valid_summ, step)
_

または、タグが tf.placeholder(tf.string, []) である単一のサマリーopを作成し、必要に応じて文字列_"training_accuracy"_または_"validation_accuracy"_をフィードすることもできます。

50
mrry

もう1つの方法は、2番目のファイルライターを使用することです。したがって、merge_summariesコマンドを使用できます。

train_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/train',
                                      sess.graph)
test_writer = tf.summary.FileWriter(FLAGS.summaries_dir + '/test')
tf.global_variables_initializer().run()

完全なドキュメントは次のとおりです。これは私のためにうまく動作します: TensorBoard:Visualizing Learning

4
stillPatrick