使用相同的图在 TensorFlow 中显示训练和验证的准确性
Posted
技术标签:
【中文标题】使用相同的图在 TensorFlow 中显示训练和验证的准确性【英文标题】:Show training and validation accuracy in TensorFlow using same graph 【发布时间】:2017-03-01 23:33:11 【问题描述】:我有一个 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 ...
这怎么可能?
【问题讨论】:
对于其他一些解决方案,我有一个类似的问题here。 这可能会回答您的问题(无需设置两个摘要目录):***.com/questions/34471563/… 【参考方案1】:您可以重复使用准确度节点,但需要使用两种不同的 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 中找到
【讨论】:
谢谢,让我试试这个……会报告的。 好的,我认为这就是问题所在:“summary_op”包含某些事物的合并摘要。但是我只想要validation_error的“摘要”......这有意义吗?就像我在 n % 100 循环中再次传入“summary_op”并取出“摘要”一样,那么它似乎会“运行”所有摘要。 (所有被合并的)。但我只想运行准确度节点... 另外,为什么test_writer里面没有“sess.graph”呢? summary_op 会将所有摘要写入测试文件。我调整了代码,现在只记录准确率摘要进行测试。 评论时不要按回车键;) test_writer 没有图表,因为它是同一个图表,然后 tensorboard 会显示两次。显示不同的“运行”(这里是相同的运行但不同的数据)是覆盖图的唯一方法。当您修改网络时,显示这两个图表会很有用。【参考方案2】:要运行相同的操作但获取具有不同 feed_dict 数据的摘要,只需将两个摘要操作附加到该操作即可。假设您想对验证数据和测试数据运行准确度操作,并希望获得两者的摘要:
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,并进行自己的日志记录。
【讨论】:
以上是关于使用相同的图在 TensorFlow 中显示训练和验证的准确性的主要内容,如果未能解决你的问题,请参考以下文章