如何评估 TensorFlow 中新的 tf.contrib.summary 摘要?

How are the new tf.contrib.summary summaries in TensorFlow evaluated?

我在理解作为操作的新 tf.contrib.summary API. In the old one, it seemed that all one was supposed to do was to run 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)

已根据要求将答案从编辑移至自行回答


我只是稍微尝试了一下,似乎如果将 tf.control_dependenciestf.record_summaries_every_n_global_steps 结合起来,它的行为符合预期,并且仅在每第 n 步记录一次摘要。但是,如果它们在一个会话中 运行 在一起,例如 session.run([train, summs]),则每隔一段时间存储一次摘要,但不是每第 n 步存储一次。我用 n=2 测试了这个,用第二种方法,总结通常是在奇数步写的,而在控制依赖方法中,它总是在偶数步。