PyTorch训练可视化(一)——可视化工具 TensorboardX

1.安装 TensorboardX

pip install tensorboardX==1.8 

后面的==1.8 是版本号。

tensorboardX运行时常会报一些奇奇怪怪的错误,如AttributeError: 'torch._C.Value' object has no attribute 'debugName'。这通常是版本号的问题。多试几个版本就可以了。

2.数字 (scalar)

使用 add_scalar 方法来记录数字常量。

add_scalar(tag, scalar_value, global_step=None, walltime=None)

参数

  •     tag (string): 数据名称,不同名称的数据使用不同曲线展示
  •     scalar_value (float): 数字常量值
  •     global_step (int, optional): 训练的 step
  •     walltime (float, optional): 记录发生的时间,默认为 time.time()

需要注意,这里的 scalar_value 一定是 float 类型,如果是 PyTorch scalar tensor,则需要调用 .item() 方法获取其数值。我们一般会使用 add_scalar 方法来记录训练过程的 loss、accuracy、learning rate 等数值的变化,直观地监控训练过程。

3.直方图 (histogram)

使用 add_histogram 方法来记录一组数据的直方图。

add_histogram(tag, values, global_step=None, bins='tensorflow', walltime=None, max_bins=None)

参数

  •     tag (string): 数据名称
  •     values (torch.Tensor, numpy.array, or string/blobname): 用来构建直方图的数据
  •     global_step (int, optional): 训练的 step
  •     bins (string, optional): 取值有 ‘tensorflow’、‘auto’、‘fd’ 等, 该参数决定了分桶的方式,详见这里。
  •     walltime (float, optional): 记录发生的时间,默认为 time.time()
  •     max_bins (int, optional): 最大分桶数

我们可以通过观察数据、训练参数、特征的直方图,了解到它们大致的分布情况,辅助神经网络的训练过程。

4.运行图 (graph)

使用 add_graph 方法来可视化一个神经网络。

add_graph(model, input_to_model=None, verbose=False, **kwargs)

参数

  •     model (torch.nn.Module): 待可视化的网络模型
  •     input_to_model (torch.Tensor or list of torch.Tensor, optional): 待输入神经网络的变量或一组变量

该方法可以可视化神经网络模型,TensorboardX 给出了一个官方样例大家可以尝试。

5.测试例程

import torch
import torch.nn as nn
from tensorboardX import SummaryWriter


class LeNet(nn.Module):
    def __init__(self):
        super(LeNet, self).__init__()
        self.conv1 = nn.Sequential(  # input_size=(1*28*28)
            nn.Conv2d(1, 6, 5, 1, 2),
            nn.ReLU(),  # (6*28*28)
            nn.MaxPool2d(kernel_size=2, stride=2),  # output_size=(6*14*14)
        )
        self.conv2 = nn.Sequential(
            nn.Conv2d(6, 16, 5),
            nn.ReLU(),  # (16*10*10)
            nn.MaxPool2d(2, 2)  # output_size=(16*5*5)
        )
        self.fc1 = nn.Sequential(
            nn.Linear(16 * 5 * 5, 120),
            nn.ReLU()
        )
        self.fc2 = nn.Sequential(
            nn.Linear(120, 84),
            nn.ReLU()
        )
        self.fc3 = nn.Linear(84, 10)

    # 定义前向传播过程,输入为x
    def forward(self, x):
        x = self.conv1(x)
        x = self.conv2(x)
        # nn.Linear()的输入输出都是维度为一的值,所以要把多维度的tensor展平成一维
        x = x.view(x.size()[0], -1)
        x = self.fc1(x)
        x = self.fc2(x)
        x = self.fc3(x)
        return x


dummy_input = torch.rand(13, 1, 28, 28)  # 假设输入13张1*28*28的图片
model = LeNet()
with SummaryWriter('runs/graph') as w:
    w.add_graph(model, dummy_input)

writer = SummaryWriter('policy_save/runs/scalar_example')
for i in range(100):
    writer.add_scalar('quadratic', i * 2, global_step=i)
    writer.add_scalar('exponential', 1.2 * i, global_step=i)

writer = SummaryWriter('policy_save/runs/another_scalar_example')
for i in range(100):
    writer.add_scalar('quadratic', i**2, global_step=i)
    writer.add_scalar('exponential', 1.2**i, global_step=i)

运行, 可以看到在项目文件中生成了runs文件夹。在终端输入,即可查看相应图表。

tensorboard --logdir=path/runs/

————————————————
参考:https://blog.csdn.net/bigbennyguo/article/details/87956434 

猜你喜欢

转载自blog.csdn.net/zxxxiazai/article/details/103118144