在张量板上记录训练和验证损失

Posted

技术标签:

【中文标题】在张量板上记录训练和验证损失【英文标题】:Logging training and validation loss in tensorboard 【发布时间】:2016-04-01 00:09:39 【问题描述】:

我正在尝试学习如何使用 tensorflow 和 tensorboard。我有一个基于MNIST neural net tutorial的测试项目。

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

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 两次运行准确度节点来做到这一点:

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)

这按预期工作。我可以打印这些值,我可以看到,最初,两个准确度都会增加,最终验证准确度会趋于平缓,而训练准确度会不断增加。

但是,我也想在 tensorboard 中获取这些值的图表,但我不知道如何做到这一点。如果我只是将scalar_summary 添加到accuracy,则记录的值将无法区分训练集和验证集。

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

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

【问题讨论】:

【参考方案1】:

有几种不同的方法可以实现这一点,但创建不同的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, []) 的单个摘要操作,并根据需要提供字符串"training_accuracy""validation_accuracy"

【讨论】:

谢谢!这正是我想要的!我的问题是我试图对merge_all_summaries 进行一次调用,而不是对每个摘要进行add_summary。文档似乎建议使用merge_all_summaries 优于单独调用add_summary,但在这种情况下,手动方式似乎更好。 没错:merge_all_summaries 是一种“一刀切”的做事方式,但单独调用add_summary 可以让您获得更多控制权。 (对于它的价值,我们通常设置单独的流程来进行训练和验证,其中验证任务有自己的 - 略有不同 - 图表并定期加载最新的模型检查点。) @mrry 是否有关于如何在参考训练检查点时运行验证的教程? 是否可以先调用 merge_all_summaries() 进行其他训练相关的操作,然后使用单独的 add_summary 进行验证集? 这是否意味着我可以制作占位符标签,并坚持merge_all_summaries()【参考方案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

【讨论】:

为什么没有为test_writer设置图表? 因为您将图形信息保存在训练集中。如果你也想要测试集中的图表,你可以添加它,但它不是必需的。

以上是关于在张量板上记录训练和验证损失的主要内容,如果未能解决你的问题,请参考以下文章

验证损失和验证准确率均高于训练损失,且ACC和波动

图像分类。验证损失在初始训练期间卡住(v1)

TensorBoard - 在同一张图上绘制训练和验证损失?

如何将张量板图用于列表/数组?

如何在交叉验证中获得 Keras scikit-learn 包装器的训练和验证损失?

Keras cifar10 示例验证和测试损失低于训练损失