TF2.0中不使用keras.fit与estimator时TensorBoard无法显示标量的问题
问题根源:缺少Summary Writer的上下文环境
你创建了train_summary_writer和test_summary_writer,但没有把tf.summary.scalar的调用绑定到对应的writer上下文——TensorFlow需要明确知道要把标量数据写入哪个日志文件,你的代码只是调用了tf.summary.scalar,却没指定目标writer,导致数据根本没写入logs/tr或logs/ts目录的事件文件,TensorBoard自然找不到数据。
修正后的代码
import tensorflow as tf train_loss = tf.keras.metrics.Mean('train_loss', dtype=tf.float32) test_loss = tf.keras.metrics.Mean('test_loss', dtype=tf.float32) train_summary_writer = tf.summary.create_file_writer('logs/tr') test_summary_writer = tf.summary.create_file_writer('logs/ts') for ep in range(1000): # 模拟更新训练/测试loss值 train_loss(1 * ep) test_loss(2 * ep) # 写入训练日志:必须在train_summary_writer的上下文环境中 with train_summary_writer.as_default(): tf.summary.scalar('trloss', train_loss.result(), step=ep) # 写入测试日志:必须在test_summary_writer的上下文环境中 with test_summary_writer.as_default(): tf.summary.scalar('tsloss', test_loss.result(), step=ep) # 重置metrics,避免累计值干扰下一个epoch的结果 train_loss.reset_states() test_loss.reset_states()
关键说明
- 上下文管理器的作用:
with writer.as_default()会将当前writer设为默认的summary写入目标,这个块内的tf.summary调用都会把数据写入对应日志文件。 - 重置metrics:如果不调用
reset_states(),train_loss.result()会返回从第一个epoch到当前的累计均值,而非当前epoch的单独值,这会导致曲线不符合你预期的线性增长趋势。 - 验证日志生成:运行修正后的代码后,去
logs/tr和logs/ts目录查看,应该会生成类似events.out.tfevents.xxxxxx的文件,此时再启动TensorBoard就能看到标量曲线了。
内容的提问来源于stack exchange,提问作者EyesBear
相关产品推荐
相关产品推荐

