在tensorboard中记录训练和验证丢失

use*_*216 38 python tensorflow tensorboard

我正在尝试学习如何使用tensorflow和tensorboard.我有一个基于MNIST神经网络教程的测试项目.

在我的代码中,我构造了一个节点,用于计算正确分类的数据集中的数字部分,如下所示:

correct = tf.nn.in_top_k(self._logits, labels, 1)
correct = tf.to_float(correct)
accuracy = tf.reduce_mean(correct)
Run Code Online (Sandbox Code Playgroud)

self._logits是图表的推理部分,labels是包含正确标签的占位符.

现在,我想做的是在训练进行时评估训练集和验证集的准确性.我可以通过运行精度节点两次,使用不同的feed_dicts来完成此操作:

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})
Run Code Online (Sandbox Code Playgroud)

这按预期工作.我可以打印这些值,我可以看到,最初,两个精度都会增加,最终验证精度会在训练精度不断提高时变平.

但是,我还想在tensorboard中得到这些值的图表,我无法弄清楚如何做到这一点.如果我只是添加一个scalar_summaryto accuracy,则记录的值将不区分训练集和验证集.

我还尝试创建两个accuracy具有不同名称的相同节点,并在训练集上运行一个,在验证集上运行一个.然后我scalar_summary为每个节点添加一个.这确实在张量板中给出了两个图形,但是它们不是显示训练集精度的一个图形而是显示验证集精度的图形,而是显示与打印到终端的任何一个都不匹配的相同值.

我可能误解了如何解决这个问题.对于不同的输入,单独记录单个节点的输出的推荐方法是什么?

mrr*_*rry 54

有几种不同的方法可以实现这一目标,但是您在创建不同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)
Run Code Online (Sandbox Code Playgroud)

或者,你可以创建一个单独的汇总运算,其标签是tf.placeholder(tf.string, [])和饲料字符串"training_accuracy""validation_accuracy"适当.

  • 是否可以首先为其他与训练相关的操作调用merge_all_summaries(),然后仅为validation_set使用单独的add_summary? (10认同)
  • 谢谢!这正是我想要的!我的问题是我试图使用单个调用`merge_all_summaries`而不是为每个摘要执行`add_summary`.文档似乎建议使用`merge_all_summaries`比单独调用`add_summary`更受欢迎,但在这种情况下,手动方式似乎更好. (7认同)
  • 这是正确的:`merge_all_summaries`是一种"一刀切"的做法,但是对`add_summary`的单独调用可以让你获得更多的控制权.(对于它的价值,我们通常会设置单独的流程来进行培训和验证,其中验证任务有自己的 - 略有不同 - 图形并定期加载到最新的模型检查点.) (6认同)

小智 5

另一种方法是使用第二个文件编写器。因此您可以使用 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()
Run Code Online (Sandbox Code Playgroud)

这是完整的文档。这对我来说很好:TensorBoard:可视化学习