什么时候必须使用 TensorFlow 的 FileWriter.flush() 方法?

When do I have to use TensorFlow's FileWriter.flush() method?

我目前正在一个稍大的 TensorFlow 项目中工作,并尝试像往常一样可视化我的网络的某些变量,即执行此工作流程

  1. 通过tf.summary.scalar('loss', loss)
  2. 声明我想跟踪的变量
  3. 通过summary_op = tf.summary.merge_all()
  4. 收集它们
  5. 将我的作者声明为 writer = tf.summary.FileWriter('PATH') 并添加图表
  6. 通过 s = sess.run(summary_op)
  7. 在我的训练迭代期间评估汇总操作
  8. 最后通过 writer.add_summary(s, epoch)
  9. 将其添加到我的作家

通常这对我来说很管用。但是这一次,我只看到了图表,当我检查事件文件时,我发现它是空的。巧合的是,我发现有人建议在添加我的摘要作为第 6 步后使用 writer.flush()。这解决了我的问题。

因此,合乎逻辑的后续问题是:我必须何时以及如何使用 FileWriter.flush() 才能使 tensorflow 正常工作?

您可以随时调用 flush,真的。这对你来说可能很清楚,但为了以防万一(和其他读者),FileWriter 不会立即将给定的摘要写入磁盘。这是因为写入磁盘相对较慢,如果您创建非常频繁的摘要(即每个批次),这样做可能会损害您的性能,因此 FileWriter 保留一个仅写入的事件缓冲区 "every once in a while" (最后当它关闭时)。然而,这意味着 TensorBoard 不会立即看到书面摘要。 flush 是否强制 FileWriter 将内存中的任何内容写入磁盘。

如果您生成的摘要频率较低(例如每 100 个批次),则在 add_summary 之后调用 flush 可能没问题。如果你不断地生成摘要,但对 FileWriter 的同步频率不满意,你可以有一个 flush 例如每十次一次,或类似的东西。我的意思是,你也可以在每次迭代中都使用它,它可能不会产生很大的不同,但也不会给你带来很大的好处。当然,任何潜在的性能影响都将取决于您的问题和您的基础架构(记录标量与图像不同,或者记录到本地 SSD 驱动器与网络存储不同,或者具有数百个元素的大而慢的批次与微小的元素不同) , 快速批次。

但一般来说,它很少是一个重要的性能因素。对于简单的场景,您得到的建议是在 add_summary 之后添加 flush(一个 flush,如果您多次调用 add_summary,则不要在每次调用之后添加 flush他们,仅在最后一个之后)很可能足够好。

编辑:tf.summary.FileWriter 实际上提供了一个构造参数,flush_secs,它定义了编写器自动将未决事件刷新到磁盘的频率。默认为两分钟。还有一个max_queue,它定义了内部事件队列(事件缓冲区)的大小。