TensorBoard 数据显示不全

最近使用 TensorBoard 纪录 PyTorch 训练模型的精确度及损失,设置的是训练损失每步都记录,但是在训练完成之后运训 TensorBoard 却发现 scalar 的横轴 step 并不是连续的,而且导出 csv 文件也是不完整的。

记录 log 代码类似于:

1
2
3
4
5
6
7
8
9
10
11
12
13
def train():
# Some code...

if episode % grad_steps == 0:
# Log train loss and acc.
writer.add_scalar("Loss/train", total_loss / max(1, total_samples), episode)
writer.add_scalar("Accuracy/train", total_acc_mean / max(1, total_samples), episode)
# Update params
optimizer.step()
scheduler.step()
optimizer.zero_grad()

# Some code...

而超参数 grad_steps 设置为 1 也会出现同样的问题。在 if 中输出日志发现 writer 确实把数值记录进去了,所以只是 TensorBoard 没有显示出来。

经过一番 Google 发现,TensorBoard GitHub 中说到,为了保证运行速度与内存,TensorBoard 默认执行降采样,例如 scalar 保持在 1000 个点。此限制可以通过参数 --samples_per_plugin 强制改变。例如 --samples_per_plugin scalars=500,images=0 将强制 scalar 保留 500 个点,image 保留所有的点。

完整示例代码为:

1
tensorboard --samples_per_plugin scalars=0 --logdir name1:/path/to/log/1,name2:/path/to/log/2

参考

https://github.com/tensorflow/tensorboard#is-my-data-being-downsampled-am-i-really-seeing-all-the-data
https://stackoverflow.com/questions/43702546/tensorboard-doesnt-show-all-data-points/