之前一直在用tensoboardx可视化,每次使用都会忘记细节,在这里整理下~,开始学习吧
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 如何使用以及各项功能的完整介绍,每项都包含了示例,给出了可视化效果,希望可以方便大家的使用。笔者水平有限,还请见谅~
开始
很简单:
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
三种初始化 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 路径来保存日志
接下来,我们就可以调用 SummaryWriter 实例的各种 add_something 方法向日志中写入不同类型的数据了。想要在浏览器中查看可视化这些数据,只要在命令行中开启 tensorboard 即可:
tensorboard --logdir=
其中的
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
即可在浏览器查看到可视化结果
可以看见在run/scalar_example生成两个文件
例子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)
同样在浏览器的可视化效果:
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)
浏览器可视化结果:
是不是很简单!!!
结合loss和神经网络的可视化就不介绍了,可参考:
Pytorch使用tensorboardX网络结构可视化。超详细!!!
详解PyTorch项目使用TensorboardX进行训练可视化