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

时间:2018-03-03 11:34:04

标签: python tensorflow tensorboard

我在理解新的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参数?
  6. 通过在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 = 2进行了测试,第二种方法的摘要通常用奇数步骤编写,而使用控制依赖方法则总是采用偶数步骤。

0 个答案:

没有答案