我正在使用TensorBoard来可视化网络指标和图表。
我创建一个会话sess = tf.InteractiveSession()
并在Jupyter笔记本中构建图形。
在图表中,我包含两个摘要标量:
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中,为每次运行创建了一个单独的标量窗口:
此外,如果我检查上次运行的数据,图表似乎是重复的:
每次运行时如何防止重复图形和标量窗口?
答案 0 :(得分:5)
我怀疑问题出现是因为你在这个过程中运行了三次代码(相同的脚本,Jupyter笔记本或其他),并且这些调用在TensorFlow中共享相同的"default graph"。 TensorFlow需要为图中的每个节点提供唯一的名称,因此它会将"_1"
和"_2"
附加到第二次和第三次调用中的摘要节点的名称。
你怎么避免这个?最简单的方法是每次运行代码时创建一个新图形。有(至少)三种方法可以做到这一点:
将代码包装在with tf.Graph().as_default():
块中,该块构造一个新的tf.Graph
对象,并将其设置为with
块范围的默认图。
如果您在创建图表之前构建会话,则可以将会话构建为sess = tf.InteractiveSession(graph=tf.Graph())
。在您致电tf.Graph
之前,新构建的sess.close()
对象仍为默认图表。
在代码调用之间调用tf.reset_default_graph()
。
with
- 块方法是“最结构化”的方法,如果您正在编写独立脚本,则最好。但是,由于您使用的是tf.InteractiveSession
,我假设您正在使用某种交互式REPL,而另外两种方法可能更有用(例如,用于在多个单元格之间拆分执行)。
答案 1 :(得分:0)
发生此问题是为了保存多个图形,如果要解决此问题,这不是问题:
tf.reset_default_graph()