在训练神经网络时,我们希望能更直观地了解训练情况,包括损失曲线、输入图片、输出图片、卷积核的参数分布等信息。这些信息能帮助我们更好地监督网络的训练过程,并为参数优化提供方向和依据。
tensorboard原本是tensorflow的可视化工具,pytorch从1.2.0开始支持tensorboard,之前的版本也可以使用tensorboardX代替。
如果没有你的pytorch版本低于1.2.0,可以直接安装tensorboardX。
pip install tensorboardX
使用的时候区别于pytorch的地方为导入的包不一样,如果直接是用tensorboardX,导入形式如下所示。
from tensorboardX import SummaryWriter
下面的示例中的tensorboard为pytorch中的工具包。
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()
from torch.utils.tensorboard import SummaryWriter
writer = SummaryWriter()#默认当前文件夹,会在当前文件下创建一个runs的文件夹。
# writer = SummaryWriter('qlee/log')
# writer = SummaryWriter('qlee')
# 标量可视化与权重直方图
for n_iter in range(100):
writer.add_scalar('Loss/scalar', n_iter**2, n_iter) #可视化单个标量值
'''
使用步骤:
tensorboard --logdir=文件夹
浏览器下访问:http://localhost:6006/
'''
运行程序之后,会在当前目录生成runs文件夹,然后执行下列命令运行可视化:
tensorboard --logdir=runs
最后打开浏览器,并输入上面输出的地址:
http://localhost:6006/
add_image(tag, img_tensor, global_step=None, walltime=None, dataformats='CHW')
tag (string)
: 数据名称img_tensor (torch.Tensor / numpy.array)
: 图像数据global_step (int, optional)
: 训练的 stepwalltime (float, optional)
: 记录发生的时间,默认为 time.time()dataformats (string, optional)
: 图像数据的格式,默认为 ‘CHW’,即Channel x Height x Width
,还可以是 ‘CHW’、‘HWC’ 或 ‘HW’ 等
add_image方法每次只能显示单张图片,方式示例如下:
from tensorboardX import SummaryWriter
import cv2 as cv
writer = SummaryWriter('runs/image_example')
#添加3张图片
for i in range(1, 4):
writer.add_image('image/add_image',
cv.cvtColor(cv.imread('data/{}.png'.format(i)), cv.COLOR_BGR2RGB),
global_step=i,
dataformats='HWC')
writer.close()
使用 torchvision 中的 make_grid 方法,将多张图片拼合成一张图片后,再调用 add_image 方法显示。
import torch
import torchvision
from torch.utils.tensorboard import SummaryWriter
from torchvision import datasets, transforms
# 设置输出文件目录
writer = SummaryWriter('runs/test')
transform = transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))])
trainset = datasets.MNIST('mnist_train', train=True, download=True, transform=transform)
trainloader = torch.utils.data.DataLoader(trainset, batch_size=64, shuffle=True)
model = torchvision.models.resnet50(False)
# Have ResNet model take in grayscale rather than RGB
model.conv1 = torch.nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3, bias=False)
images, labels = next(iter(trainloader))
grid = torchvision.utils.make_grid(images)
writer.add_image('images', grid, 0)
# 写入图像数据
writer.add_graph(model, images)
# 写入模型
writer.close()
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)
: 待输入神经网络的变量或一组变量
第4步已经添加了使用模型添加了网络模型和输入数据。
模型显示图如下所示:
pytorch版本tensorboard:https://pytorch.org/docs/stable/tensorboard.html
官方教程:https://tensorboardx.readthedocs.io/en/latest/tensorboard.html