Tensorboard add_scalar在for循环中仅记录最后一个值的问题排查
问题原因
TensorBoard的add_scalar方法中,第三个参数global_step的设计初衷是记录训练过程中的整数迭代步数,而非自定义的浮点型阈值。当你传入浮点数作为global_step时,TensorBoard内部对数据的索引和渲染逻辑会出现异常,导致多个数据点无法被正确识别和展示,最终只保留最后一个写入的数据。
解决方法
以下两种方案可以解决这个问题:
方案1:将阈值作为Tag的一部分
把每个阈值对应的准确率作为独立的曲线条目,用固定的整数(比如当前训练轮次epoch)作为global_step:
# 假设当前训练轮次为epoch,也可以用0这类固定值 epoch = 5 for threshold, acc in eval_metrics['accuracy'].items(): writer.add_scalar(f'acc/threshold_{threshold}', acc, global_step=epoch)
这样在TensorBoard的标量面板中,你会看到以acc/threshold_0.2、acc/threshold_0.4命名的多个曲线,每个曲线对应一个阈值的准确率。
方案2:将阈值转换为整数步长
如果希望把阈值作为横轴展示,可以将浮点型阈值转换为整数(比如乘以10放大),作为global_step传入:
for threshold, acc in eval_metrics['accuracy'].items(): # 将阈值放大10倍转为整数,避免浮点型step的问题 step = int(threshold * 10) writer.add_scalar('acc', acc, global_step=step)
此时TensorBoard的横轴会显示2、4、6、8,对应原阈值0.2、0.4、0.6、0.8,所有数据点都会被正确渲染。
额外注意事项
写完所有数据后,务必调用以下方法确保数据被写入磁盘:
writer.flush() writer.close()
内容的提问来源于stack exchange,提问作者Jonicorn
相关产品推荐
相关产品推荐

