我何时必须使用TensorFlow的FileWriter.flush()方法?

时间:2018-09-24 16:07:17

标签: python tensorflow tensorboard

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

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

通常,这为我完成了工作。但是这一次,我只显示了图形,当我检查事件文件时,发现它为空。碰巧的是,我发现有人建议在将我的摘要添加为第六步后使用writer.flush()。这解决了我的问题。

因此,逻辑上的后续问题是:何时以及如何使用FileWriter.flush()使tensorflow正常工作?

1 个答案:

答案 0 :(得分:2)

您确实可以随时致电flush。对于您来说,这可能很清楚,但是为了防万一(对于其他读者),FileWriter不会立即将给定的摘要写入磁盘。这是因为写入磁盘的速度相对较慢,并且如果创建的摘要非常频繁(例如每个批次),则可能会损害性能,因此FileWriter保留了仅在每个事件中写入“每个事件一次”的缓冲区。 while”(最后是关闭时)。但是,这意味着TensorBoard将不会立即看到书面摘要。 flush会强制FileWriter写入磁盘中的任何内存。

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

通常,它很少是重要的性能因素。对于简单的情况,建议您在flush之后添加add_summary(一个flush,如果您多次调用add_summary,则不要在每个flush之后添加flush_secs它们,只有在最后一个之后)才足够好。

编辑:tf.summary.FileWriter实际上提供了一个构造参数max_queue,该参数定义了编写器将待处理事件自动刷新到磁盘的频率。默认情况下是两分钟。还有一个Could not get JDBC Connection; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object ,它定义了内部事件队列(事件的缓冲区)的大小。