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

Jak*_*old 13 python tensorflow tensorboard

我在理解新tf.contrib.summaryAPI时遇到了一些麻烦.在旧版本中,似乎所有人应该做的就是运行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)
Run Code Online (Sandbox Code Playgroud)

现在来几个问题:

  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)
Run Code Online (Sandbox Code Playgroud)

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

Jak*_*old 2

根据要求,答案从编辑移至自我回答


我只是稍微玩了一下,似乎如果tf.control_dependenciestf.record_summaries_every_n_global_steps它结合起来就会按预期运行,并且每第 n 步才会记录摘要。但是,如果它们在一个会话中一起运行,例如session.run([train, summs]),则每隔一段时间就会存储一次摘要,但不是每第 n 步就存储一次。我用 n=2 对此进行了测试,使用第二种方法时,摘要通常以奇数步骤编写,而使用控制依赖方法时,它始终以偶数步骤编写。