Pytorch使用tensorboard

基本使用

首先需要安装tensorboard

# -U 表示如果存在则升级
pip3 install -U tensorboard

接着就可以直接在代码中使用

from torch.utils.tensorboard import SummaryWriter
...
# 默认会在项目路径下创建 runs 文件夹
dashboard = SummaryWriter()
...
dashboard.add_scalar('Loss/train', loss.item(), i)
...
dashboard.close()

查看图表

tensorboard --logdir=./runs

显示模型学习量变化

for idx, (x, y) in enumerate(test_data_loader):
    ...
    # 显示所有学习量变化
    for name, parm in model.named_parameters():
        dashboard.add_histogram('Weight/'+name, parm, i)

    # 仅显示指定学习量
    dashboard.add_histogram('Weight/myweigth', model.fc.weight, i)
    ...

Histogram

需要知道的是,上图中,虽然只是 gru.bias_hh_l1 的取值变化,但这个bias并不只是代表一个值,而是一堆值(想象一个线性方程组中的参数),故它只是反应这一堆值的分布变化,而不是追踪其中一个值的变化

事实上,并不能单纯地直接将横轴理解为学习量的取值,它仅表示一个范围。具体地,例如你不能直接从图中看出取值为0的学习量有多少(-0.0269同理),你只能通过计算 (-0.01, +0.01) 这个区间内的积分,大致估算出取值为0的有多少。

DISTRIBUTIONS

Distributions图和Histogram图是同源的,也就是说他俩是同一数据的不同展示形式。他们都展示的是某学习量的分布情况,相较而言,我认为Distributions更直观

初始化权重

def init_weight(m):
    if isinstance(m, torch.nn.GRU):
        m.weight_ih_l0.data.fill_(1)
        m.weight_hh_l0.data.fill_(1)
        m.bias_ih_l0.data.fill_(0)
        m.bias_hh_l0.data.fill_(0)

        ...
model.apply(init_weight)

在一个图中显示多条曲线

创建多个SummaryWriter对象并指定不同的目录,添加数据项时指定相同的名称即可

dashboard1 = SummaryWriter('./runs/1')
dashboard2 = SummaryWriter('./runs/2')

for i in range(100):
    dashboard1.add_scalar('mychart', i, i)
    dashboard2.add_scalar('mychart', i*2, i)

在其 公共父目录 启动

tensorboard --logdir=./runs

将生成的两个日志目录都勾上即可

Leave a Comment