TensorBoard 记录统计数据与训练分开

TensorBoard recording stats separate from training

我正在尝试使用 TensorBoard 显示神经网络训练的一些图表 运行。 (也就是说,训练期间测试和验证准确性的图表,而不仅仅是网络结构的图表。)有一些例子 code

以及本网站上的一些问题,所有这些问题似乎都遵循与示例代码相同的模式。也就是说,模式总是围绕着

这样的东西
summary, _ = sess.run([merged, train_step], ...

所以基本上,运行训练步骤和记录图形显示统计数据的操作正在合并。

就目前而言这很好,但我正在尝试将图形改造为现有程序,该程序不可避免地会以略有不同的方式执行操作,因此示例代码无法按原样运行。我真正想做的是隔离一些 仅记录统计数据 的代码,与现有代码分开进行训练。

如何在主训练循环中记录 TensorBoard 的统计数据,但与进行训练的代码分开?

您可以手动创建存储标量值的 tf.Summary 对象并将其传递给 tf.summary.FileWriter,如下例所示:

summary_writer = tf.summary.FileWriter("path_to_log_dir")
# ...
for i in range(max_training_steps):
  # compute the values of interest
  scalar_value_1 = ...
  # ...
  scalar_value_n = ...

  # manually create tf.Summary object
  summary = tf.Summary(
    value=[tf.Summary.Value(tag="Metrics_1", simple_value=scalar_value_1),
           # ...
           tf.Summary.Value(tag="Metrics_n", simple_value=scalar_value_n)])
  summary_writer.add_summary(summary, i)
# ...
summary_writer.close()

或者,您可以使用 tf.placeholder 作为张量来定义 tf.summary.scalar() 操作,并在 运行 时输入实际值:

scalar_pl_1 = tf.placeholder(tf.float32)
tf.summary.scalar("Metrics_1", scalar_pl_1)
# ...
scalar_pl_n = tf.placeholder(tf.float32)
tf.summary.scalar("Metrics_n", scalar_pl_n)

# Merge all summaries
merged = tf.summary.merge_all()

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

with tf.Session() as sess:
  for i in range(max_training_steps):
    # compute scalar values of interest
    scalar_value_1 = ...
    scalar_value_n = ...

    feed_dict = {scalar_pl_1: scalar_value_1, scalar_pl_n: scalar_value_n}
    summary = sess.run(merged, feed_dict=feed_dict)
    summary_writer.add_summary(summary, i)
# ...
summary_writer.close()