PyTorch下的可视化工具

作者 | 锦恢@知乎 (已授权)
来源 | https://zhuanlan.zhihu.com/p/220403674
编辑 | 极市平台
一、网络结构的可视化
我们训练神经网络时,除了随着step或者epoch观察损失函数的走势,从而建立对目前网络优化的基本认知外,也可以通过一些额外的可视化库来可视化我们的神经网络结构图 。这将更加地高效地向读者展现目前的网络结构 。
为了可视化神经网络,我们先建立一个简单的卷积层神经网络:
import torch import torch.nn as nn class Con.NET(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Sequential( nn.Conv2d(1, 16, 3, 1, 1), nn.ReLU(), nn.AvgPool2d(2, 2) ) self.conv2 = nn.Sequential( nn.Conv2d(16, 32, 3, 1, 1), nn.ReLU(), nn.MaxPool2d(2, 2) ) self.fc = nn.Sequential( nn.Linear(32 * 7 * 7, 128), nn.ReLU(), nn.Linear(128, 64), nn.ReLU() ) self.out = nn.Linear(64, 10) def forward(self, x): x = self.conv1(x) x = self.conv2(x) x = x.view(x.size(0), -1) x = self.fc(x) output = self.out(x) return output
输出网络结构:
MyConvNet = ConvNet() print(MyConvNet)
输出结果:
ConvNet( (conv1): Sequential( (0): Conv2d(1, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): AvgPool2d(kernel_size=2, stride=2, padding=0) ) (conv2): Sequential( (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1)) (1): ReLU() (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False) ) (fc): Sequential( (0): Linear(in_features=1568, out_features=128, bias=True) (1): ReLU() (2): Linear(in_features=128, out_features=64, bias=True) (3): ReLU() ) (out): Linear(in_features=64, out_features=10, bias=True) )
有了基本的神经网络后,我们分别通过HiddenLayer和PyTorchViz库来可视化上述的卷积层神经网络 。
 

需要说明的是,这两个库都是基于Graphviz开发的,因此倘若你的电脑上没有安装并且没有添加环境变量,请自行安装Graphviz工具,安装教程
1.1 通过HiddenLayer可视化网络 
首先当然是安装库啦,打开cmd,输入:
pip install hiddenlayer
绘制的基本程序如下:
import hiddenlayer as h vis_graph = h.build_graph(MyConvNet, torch.zeros([1 ,1, 28, 28])) # 获取绘制图像的对象 vis_graph.theme = h.graph.THEMES["blue"].copy() # 指定主题颜色 vis_graph.save("./demo1.png") # 保存图像的路径
效果如下:
PyTorch下的可视化工具

文章插图
 
1.2 通过PyTorchViz可视化网络
先安装库:
pip install torchviz
这里我们只使用可视化函数make_dot()来获取绘图对象,基本使用和HiddenLayer差不多,不同的地方在于PyTorch绘图之前可以指定一个网络的输入值和预测值 。
from torchviz import make_dot x = torch.randn(1, 1, 28, 28).requires_grad_(True) # 定义一个网络的输入值 y = MyConvNet(x) # 获取网络的预测值 MyConvNetVis = make_dot(y, params=dict(list(MyConvNet.named_parameters()) + [('x', x)])) MyConvNetVis.format = "png" # 指定文件生成的文件夹 MyConvNetVis.directory = "data" # 生成文件 MyConvNetVis.view()
打开与上述代码相同根目录下的data文件夹,里面会有一个.gv文件和一个.png文件,其中的.gv文件是Graphviz工具生成图片的脚本代码,.png是.gv文件编译生成的图片,直接打开.png文件就行 。
 
默认情况下,上述程序运行后会自动打开.png文件
 
生成图片:
PyTorch下的可视化工具

文章插图
 
二、训练过程可视化
观察我们的网络的每一步的损失函数或准确率的变化可以有效地帮助我们判断当前训练过程的优劣 。如果能将这些过程可视化,那么我们判断的准确性和舒适性都会有所增加 。
此处主要讲通过可视化神器tensorboardX和刚刚用到的HiddenLayer来实现训练过程的可视化 。
为了训练网络,我们先导入训练网络需要的数据,此处就导入MNIST数据集,并做训练前的一些基本的数据处理 。
import torchvision import torch.utils.data as Data # 准备训练用的MNIST数据集 train_data = https://www.isolves.com/it/ai/2022-09-21/torchvision.datasets.MNIST( root = "./data/MNIST", # 提取数据的路径 train=True, # 使用MNIST内的训练数据 transform=torchvision.transforms.ToTensor(), # 转换成torch.tensor download=False # 如果是第一次运行的话,置为True,表示下载数据集到root目录 ) # 定义loader train_loader = Data.DataLoader( dataset=train_data, batch_size=128, shuffle=True, num_workers=0 ) test_data = torchvision.datasets.MNIST( root="./data/MNIST", train=False, # 使用测试数据 download=False ) # 将测试数据压缩到0-1 test_data_x = test_data.data.type(torch.FloatTensor) / 255.0 test_data_x = torch.unsqueeze(test_data_x, dim=1) test_data_y = test_data.targets # 打印一下测试数据和训练数据的shape print("test_data_x.shape:", test_data_x.shape) print("test_data_y.shape:", test_data_y.shape) for x, y in train_loader: print(x.shape) print(y.shape) break


推荐阅读