如何评估 TensorFlow 中的新 tf.contrib.summary 摘要?
Posted
技术标签:
【中文标题】如何评估 TensorFlow 中的新 tf.contrib.summary 摘要?【英文标题】:How are the new tf.contrib.summary summaries in TensorFlow evaluated? 【发布时间】:2018-08-11 12:39:36 【问题描述】:我在理解新的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)
,因为它们在图中有依赖关系,对吧?
如果 2) 为真,我不能只在训练步骤中添加一个控制依赖项,以便在每次列车运行时编写摘要吗?或者这是一种不好的做法?
对于将要同时评估的事物通常使用控制依赖项有什么缺点吗?
为什么tf.contrib.summary.scalar
(和其他人)接受step
参数?
通过在 3) 中添加控制依赖项,我的意思是这样做:
tf.control_dependencies(summaries):
train = tf.train.AdamOptimizer().minimize(loss, global_step=step)
【问题讨论】:
请从您的编辑中创建一个答案。 【参考方案1】:应要求将答案从编辑移至自行回答
我只是稍微玩了一下,似乎如果将tf.control_dependencies
与tf.record_summaries_every_n_global_steps
结合起来,它的行为与预期一样,并且只会在每第 n 步记录一次摘要。但是如果它们在一个会话中一起运行,例如session.run([train, summs])
,则每隔一段时间就会存储一次摘要,但不是每第 n 步都存储一次。我用 n=2 对此进行了测试,而第二种方法的摘要通常以奇数步编写,而使用控制依赖方法时,它总是以偶数步编写。
【讨论】:
以上是关于如何评估 TensorFlow 中的新 tf.contrib.summary 摘要?的主要内容,如果未能解决你的问题,请参考以下文章
DNNCLassifier Tensorflow 上的 label_keys 类型错误
如何在 Tensorflow 对象检测 api 中评估预训练模型
如何在 tensorflow 2.0 中更改用于训练和评估的图像数量?