我目前正在一个更大的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)
将它添加到我的作者中通常,这为我完成了工作。但是这一次,我只显示了图形,当我检查事件文件时,发现它为空。碰巧的是,我发现有人建议在将我的摘要添加为第六步后使用writer.flush()
。这解决了我的问题。
因此,逻辑上的后续问题是:何时以及如何使用FileWriter.flush()
使tensorflow正常工作?
答案 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
,它定义了内部事件队列(事件的缓冲区)的大小。