什么时候必须使用 TensorFlow 的 FileWriter.flush() 方法?
When do I have to use TensorFlow's FileWriter.flush() method?
我目前正在一个稍大的 TensorFlow 项目中工作,并尝试像往常一样可视化我的网络的某些变量,即执行此工作流程
- 通过
tf.summary.scalar('loss', loss)
声明我想跟踪的变量
- 通过
summary_op = tf.summary.merge_all()
收集它们
- 将我的作者声明为
writer = tf.summary.FileWriter('PATH')
并添加图表
- 通过
s = sess.run(summary_op)
在我的训练迭代期间评估汇总操作
- 最后通过
writer.add_summary(s, epoch)
将其添加到我的作家
通常这对我来说很管用。但是这一次,我只看到了图表,当我检查事件文件时,我发现它是空的。巧合的是,我发现有人建议在添加我的摘要作为第 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
,它定义了内部事件队列(事件缓冲区)的大小。
我目前正在一个稍大的 TensorFlow 项目中工作,并尝试像往常一样可视化我的网络的某些变量,即执行此工作流程
- 通过
tf.summary.scalar('loss', loss)
声明我想跟踪的变量
- 通过
summary_op = tf.summary.merge_all()
收集它们
- 将我的作者声明为
writer = tf.summary.FileWriter('PATH')
并添加图表 - 通过
s = sess.run(summary_op)
在我的训练迭代期间评估汇总操作
- 最后通过
writer.add_summary(s, epoch)
将其添加到我的作家
通常这对我来说很管用。但是这一次,我只看到了图表,当我检查事件文件时,我发现它是空的。巧合的是,我发现有人建议在添加我的摘要作为第 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
,它定义了内部事件队列(事件缓冲区)的大小。