summarywriter 写了数据却在 tensorboard 里看不到,常见原因是日志目录未被正确监听、writer 未 flush 或 tensorboard 启动时指向错误路径;必须用 --logdir=runs(而非子目录)启动,且 writer 需初始化一次、flush 及时、step 递增、add_graph 在训练前调用并确保模型与输入设备一致。

PyTorch 自带的 torch.utils.tensorboard 能直接写入 TensorBoard 日志,但默认不启动 Web 服务;你得手动开 tensorboard 进程,且日志路径、writer 初始化时机、标量/图像/模型图的写入方式稍有不慎就会看不到数据。
为什么 SummaryWriter 写了数据却在 TensorBoard 里看不到?
常见原因是日志目录未被正确监听,或 writer 没 flush,或 tensorboard 启动时指向了错误路径。TensorBoard 不自动扫描子目录,必须精确指定 --logdir 到包含 tfevents 文件的父目录。
- 确保
SummaryWriter初始化时传入的路径存在且可写,例如SummaryWriter('runs/exp1') - 训练循环中每写一次标量(如 loss),建议调用
writer.add_scalar('Loss/train', loss.item(), step),其中step必须是递增整数,不能复用 epoch - 训练结束后或每若干步调用
writer.flush(),否则缓冲区数据可能滞留 - 启动命令必须是
tensorboard --logdir=runs(不是runs/exp1),因为runs是日志根目录,TensorBoard 会自动发现其下所有子实验
如何把模型结构图显示在 TensorBoard 中?
add_graph 只支持一次性静态图捕获,且要求模型和输入都位于 CPU 或同一 GPU 上;若模型含动态控制流(如 if、for)、或输入 shape 不固定(如 NLP 中变长序列未 pad),会报错或图不完整。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
- 输入张量需有确定 shape,例如
dummy_input = torch.randn(1, 3, 224, 224)(不要用torch.rand随机生成后才送进模型) - 模型必须处于
eval()或train()模式,不能是model.train(False)这种等效但非标准写法 - 调用位置应在 writer 初始化后、训练开始前,且只调用一次:
writer.add_graph(model, dummy_input) - 注意:若模型含
torch.jit.script或自定义 C++ 扩展,add_graph可能失败,此时应降级为仅记录参数直方图
训练中断后如何续写日志而不覆盖旧数据?
TensorBoard 日志文件名含时间戳,只要每次 SummaryWriter 初始化时指定相同路径,就会追加新事件;但若手动删过 runs/exp1 下的 tfevents 文件,或改用不同时间初始化 writer,会导致时间线断裂或图表重叠。
- 不要清空整个日志目录,如需清理,只删旧的
tfevents.*文件,保留目录结构 - 避免在循环中反复创建
SummaryWriter,应在训练前初始化一次,复用整个生命周期 - 若要区分多次运行,用带时间戳的子目录:
from datetime import datetime; log_dir = f'runs/{datetime.now().strftime("%Y%m%d_%H%M%S")}' - 多卡训练时,只在 rank 0 进程写日志,其他进程跳过
add_scalar等操作,否则会写入重复或冲突事件
真正容易被忽略的是 flush 时机和 logdir 层级——很多人把 writer 放进 epoch 循环里反复 new,或者启动 tensorboard 时多点了一级目录,结果页面空白还查半天代码。日志路径和 writer 生命周期比具体画什么图更关键。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










