2016-10-20 29 views
16

我有一個TensorFlow模型,並且此模型的一部分評估準確性。 accuracy只是張量流圖中的另一個節點,需要logitslabels使用同一圖表顯示TensorFlow中的訓練和驗證準確性

當我要繪製的訓練精度,這是簡單的:我有類似:

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) 
    ... 

而且對於循環,每一次說100次迭代,我想評估驗證的準確性。我有一個單獨的feed_dict,我可以在python中很好地評估驗證的準確性。

但是,這裏是我的問題:我想通過使用accuracy節點,對驗證準確性做出另一個摘要。我不清楚如何做到這一點。由於我有accuracy節點,所以我應該可以重新使用它,這是有道理的,但我不確定如何準確完成此操作,以便我還可以將驗證準確性作爲單獨的標量總結寫出來...

這怎麼可能?

+0

對於其他一些解決方案,我有一個類似的問題[這裏](http://stackoverflow.com/questions/37146614/tensorboard-plot-training-and-validation-losses-on-the-samegraph)。 – golmschenk

+0

這可能會回答你的問題(沒有設置兩個摘要目錄):http://stackoverflow.com/questions/34471563/logging-training-and-validation-loss-in-tensorboard –

回答

22

您可以重複使用精度節點,但需要使用兩個不同的SummaryWriters,一個用於訓練運行,另一個用於測試數據。您還必須將精度的標量彙總分配給一個變量。

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方法文檔的https://www.tensorflow.org/versions/r0.11/how_tos/summaries_and_tensorboard/index.html

+0

謝謝你讓我試試這個...將回報。 – Spacey

+0

好,所以我認爲這是問題:「summary_op」包含一些事物的合併摘要。不過,我只是想爲validation_error提供「總結」......這有意義嗎?就像如果我在n%100循環內再次傳遞「summary_op」並獲取「摘要」,那麼它似乎會「運行」所有摘要。 (所有合併的)。但我只想要精確性節點運行... – Spacey

+0

另外,爲什麼test_writer中沒有「sess.graph」? – Spacey

4

運行相同的操作,但得到總結與不同feed_dict數據,只需連接兩個總結OPS該運算。假設你想在這兩個驗證和測試數據運行精度運算,並希望得到總結爲兩個:

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) 

還記得你總是可以拉生(標量)數據出protobuff summary_str像this,做你自己日誌記錄。

相關問題