关于 python:TensorBoard 记录与训练分开的统计数据

TensorBoard recording stats separate from training

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

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

1
summary, _ = sess.run([merged, train_step], ...

所以基本上,运行训练步骤和记录统计数据以显示图表的操作被混为一谈。

就目前而言,这很好,但我正在尝试将图表改进为现有程序,该程序不可避免地会以稍微不同的方式做事,因此示例代码不会按原样工作。我真正想做的是隔离一些只记录统计信息的代码,与现有代码分开来进行训练。

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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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() 操作,并在运行时提供实际值:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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()