PyTorch项目使用TensorboardX进行训练可视化

PyTorch项目使用TensorboardX进行训练可视化

之前一直在用tensoboardx可视化,每次使用都会忘记细节,在这里整理下~,开始学习吧

1. 入门:什么是TensorboardX

Tensorboard 是 TensorFlow 的一个附加工具,可以记录训练过程的数字、图像等内容,以方便研究人员观察神经网络训练过程。可是对于 PyTorch 等其他神经网络训练框架并没有功能像 Tensorboard 一样全面的类似工具,一些已有的工具功能有限或使用起来比较困难 (tensorboard_logger, visdom等) 。TensorboardX 这个工具使得 TensorFlow 外的其他神经网络框架也可以使用到 Tensorboard 的便捷功能。TensorboardX 的 github仓库这里。

TensorboardX支持scalar, image, figure, histogram, audio, text, graph, onnx_graph, embedding, pr_curve and videosummaries等不同的可视化展示方式

虽然TensorboardX 的文档相对详细,但大部分缺少相应的示例。在这里对TensorboardX 如何使用以及各项功能的完整介绍,每项都包含了示例,给出了可视化效果,希望可以方便大家的使用。笔者水平有限,还请见谅~
开始

2. 开始前的准备:配置TensorboardX

很简单:
pip install tensorflow
pip install tensorboardX,但是要注意万年不变的版本问题!!!
环境:
操作系统:windows/liunx 笔者均使用anaconda来安装包,万年好用
Python 3.6
PyTorch = 1.5.1 && torchvision = 0.6.1 && tensorboard = 2.2.2(针对tensorboard 2.1版本的)
其他版本请参考 github仓库中README进行配置
安装:
(1)pip install tensorboardX
(2)从源码安装:git clone https://github.com/lanpa/tensorboardX && cd tensorboardX && python setup.py install

3. 使用TensorboardX

3.1 创建一个 SummaryWriter 的示例:

三种初始化 SummaryWriter 的方法:

from tensorboardX import SummaryWriter

# 创建实例writer1 
# log将会被保存到run/exp
writer1 = SummaryWriter('runs/exp')

# 创建实例writer2 自动生成文件名
# The log directory will be something like 'runs/Aug20-17-20-33'
writer2 = SummaryWriter()

# 创建实例writer2,自动生成文件名,并且comment参数值添加到文件名.
#runs/Aug20-17-20-33-resnet保存日志
# The log directory will be something like 'runs/Aug20-17-20-33-resnet'
writer3 = SummaryWriter(comment='resnet')

说明:三种初始化SummaryWriter 的方法
(1)提供一个路径,将使用该路径来保存日志
(2)无参数,默认将使用 runs/日期时间 路径来保存日志
(3)提供一个 comment 参数,将使用 runs/日期时间-comment 路径来保存日志

3.2 向日志中写入不同类型的数据

接下来,我们就可以调用 SummaryWriter 实例的各种 add_something 方法向日志中写入不同类型的数据了。想要在浏览器中查看可视化这些数据,只要在命令行中开启 tensorboard 即可:
tensorboard --logdir= 请注意pycharm请使用绝对路径
其中的 既可以是单个 run 的路径,如上面 writer1 生成的 runs/exp;也可以是多个 run 的父目录,如 runs/ 下面可能会有很多的子文件夹,每个文件夹都代表了一次实验,我们令 --logdir=runs/ 就可以在 tensorboard 可视化界面中方便地横向比较 runs/ 下不同次实验所得数据的差异。

3.2.1使用各种 add 方法记录数据(重点)

1. 数字 (scalar)
使用 add_scalar 方法来记录数字常量:

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

参数说明:
tag (string): 数据名称,不同名称的数据使用不同曲线展示
scalar_value (float): 数字常量值,理解为y轴的数据值
global_step (int, optional): 训练的 step 理解为x轴数据值
walltime (float, optional): 记录发生的时间,默认为 time.time()
需要注意,这里的 scalar_value 一定是 float 类型,如果是 PyTorch scalar tensor,则需要调用 .item() 方法获取其数值。我们一般会使用 add_scalar 方法来记录训练过程的 loss、accuracy、learning rate 等数值的变化,直观地监控训练过程。
看一个简单的例:1:

#在一个路径为 runs/scalar_example 的 run 中分别写入了二次函数数据 quadratic 和指数函数数据 exponential
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/scalar_example')   #新建一个run文件夹
for i in range(10):
    writer.add_scalar('quadratic', i**2, global_step=i)  
    writer.add_scalar('exponential', 2**i, global_step=i)

在终端运行tensorboard --logdir runs
即可在浏览器查看到可视化结果
PyTorch项目使用TensorboardX进行训练可视化_第1张图片
可以看见在run/scalar_example生成两个文件
PyTorch项目使用TensorboardX进行训练可视化_第2张图片

例子2:
接下来我们在另一个路径为 runs/another_scalar_example 的 run 中写入名称相同但参数不同的二次函数和指数函数数据,可视化效果如下。我们发现相同名称的量值被放在了同一张图表中展示,方便进行对比观察。同时,我们还可以在屏幕左侧的 runs 栏选择要查看哪些 run 的数据。

#在一个路径为 runs/scalar_example 的 run 中分别写入了三次函数数据 quadratic 和指数函数数据 exponential
from tensorboardX import SummaryWriter
writer = SummaryWriter('runs/another_scalar_example')
for i in range(10):
    writer.add_scalar('quadratic', i**3, global_step=i)
    writer.add_scalar('exponential', 3**i, global_step=i)

同样在浏览器的可视化效果:
PyTorch项目使用TensorboardX进行训练可视化_第3张图片
2. 运行图 (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 给出了一个官方样例尝试
代码:

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)
 

浏览器可视化结果:
PyTorch项目使用TensorboardX进行训练可视化_第4张图片
是不是很简单!!!
结合loss和神经网络的可视化就不介绍了,可参考:
Pytorch使用tensorboardX网络结构可视化。超详细!!!
详解PyTorch项目使用TensorboardX进行训练可视化

你可能感兴趣的:(PyTorch项目使用TensorboardX进行训练可视化)