Tensorboard 标量和图形重复

Tensorboard scalars and graphs duplicated

我正在使用 TensorBoard 可视化网络指标和图表。

我创建了一个会话 sess = tf.InteractiveSession() 并在 Jupyter notebook 中构建图表。

在图中,我包含了两个汇总标量:

with tf.variable_scope('summary') as scope:    
   loss_summary = tf.summary.scalar('Loss', cross_entropy)
   train_accuracy_summary = tf.summary.scalar('Train_accuracy', accuracy)

然后我创建一个 summary_writer = tf.summary.FileWriter(logdir, sess.graph) 和 运行:

_,loss_sum,train_accuracy_sum=sess.run([...],feed_dict=feed_dict)

我写指标:

summary_writer.add_summary(loss_sum, i)
summary_writer.add_summary(train_accuracy_sum, i) 

我运行代码三遍。

每次 运行,我都会重新导入 TF 并创建一个新的交互式会话。

但是,在 Tensorboard 中,为每个 运行:

创建了一个单独的标量 window

此外,如果我检查最后一个 运行:

的数据,图表似乎是重复的

如何防止每次 运行 时图形和标量 window 重复?

我怀疑问题的出现是因为您在该过程中 运行 三次调用代码(相同的脚本、Jupyter notebook 或其他),并且这些调用在 TensorFlow 中共享相同的 "default graph" . TensorFlow 需要给图中的每个节点一个唯一的名称,因此它在第二次和第三次调用时将 "_1""_2" 附加到摘要节点的名称。

你如何避免这种情况?最简单的方法是每次 运行 代码时创建一个新图表。有(至少)三种方法可以做到这一点:

  • 将代码包装在 with tf.Graph().as_default(): block, which constructs a new tf.Graph 对象中并将其设置为 with 块范围的默认图形。

  • 如果您在创建图表之前构建您的会话,您可以将您的会话构建为sess = tf.InteractiveSession(graph=tf.Graph())。新构造的 tf.Graph 对象保持为默认图,直到您调用 sess.close().

  • 在代码调用之间调用 tf.reset_default_graph()

with-block 方法是 "most structured" 做事的方法,如果您正在编写独立脚本,这可能是最好的方法。但是,由于您使用的是 tf.InteractiveSession,我假设您使用的是某种交互式 REPL,而其他两种方法可能更有用(例如,将执行拆分到多个单元格中)。

如果你想解决这个问题,这个问题发生在持有多个图表上:

tf.reset_default_graph()