如何评估 TensorFlow 中新的 tf.Contrib.Summary 摘要?

我在理解新的 tf.contrib.summary API 方面遇到了一点困难。在旧版本中,人们似乎只需要运行 tf.summary.merge_all()并将其作为一个操作来运行。

但是现在我们有了像 tf.contrib.summary.record_summaries_every_n_global_steps这样的东西,可以这样使用:

import tensorflow.contrib.summary as tfsum


summary_writer = tfsum.create_file_writer(logdir, flush_millis=3000)
summaries = []


# First we create one summary which runs every n global steps
with summary_writer.as_default(), tfsum.record_summaries_every_n_global_steps(30):
summaries.append(tfsum.scalar("train/loss", loss))


# And then one that runs every single time?
with summary_writer.as_default(), tfsum.always_record_summaries():
summaries.append(tfsum.scalar("train/accuracy", accuracy))


# Then create an optimizer which uses a global step
step = tf.create_global_step()
train = tf.train.AdamOptimizer().minimize(loss, global_step=step)

现在有几个问题:

  1. 如果我们只是在循环中运行 session.run(summaries),我假设精度汇总每次都会被写入,而损失不会被写入,因为它只有在全局步骤被30整除的情况下才会被写入?
  2. 假设汇总会自动评估它们的依赖关系,我从来不需要运行 session.run([accuracy, summaries]),但是可以只运行 session.run(summaries),因为它们在图中有一个依赖关系,对吗?
  3. 如果2)为真,我是否可以在训练步骤中添加一个控制依赖项,以便在每次列车运行时写出摘要?还是说这是个坏习惯?
  4. 对于那些无论如何都要在同一时间进行计算的事情,通常使用控件依赖关系有什么不利之处吗?
  5. 为什么 tf.contrib.summary.scalar(和其他的)采用 step参数?

在3中添加一个控制依赖项,我的意思是这样做:

tf.control_dependencies(summaries):
train = tf.train.AdamOptimizer().minimize(loss, global_step=step)
4719 次浏览

答案从编辑移动到自我答复的要求


我只是稍微玩了一下这个,似乎如果一个结合了 tf.control_dependenciestf.record_summaries_every_n_global_steps,它的表现和预期的一样,并且总结只在每个 n 步被记录下来。但是如果它们在一个会话中一起运行,比如 session.run([train, summs]),那么每隔一段时间就会存储一次摘要,但不是每个步骤都存储摘要。我使用 n = 2对此进行了测试,使用第二种方法时,总结通常是在奇怪的步骤中编写的,而使用控件依赖性方法时,总是在偶数步骤中编写。