我在理解新的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)
现在提出几个问题:
session.run(summaries)
,我认为精确度摘要每次都会被写入,而丢失则不会,因为只有当全局步骤可以被30整除时才会写入?session.run([accuracy, summaries])
但是可以运行session.run(summaries)
,因为它们在图中有依赖关系,对吧?tf.contrib.summary.scalar
(和其他人)会接受step
参数?通过在3)中添加控制依赖项,我的意思是这样做:
tf.control_dependencies(summaries):
train = tf.train.AdamOptimizer().minimize(loss, global_step=step)
编辑:我只是稍微玩了一下,似乎如果将tf.control_dependencies
和tf.record_summaries_every_n_global_steps
结合起来,它的行为与预期一致,只会记录摘要每第n步。但是如果它们在一个会话中一起运行,例如session.run([train, summs])
,那么摘要每隔一段时间就存储一次,但不是每一步都存储。我用n = 2进行了测试,第二种方法的摘要通常用奇数步骤编写,而使用控制依赖方法则总是采用偶数步骤。