赞
踩
我们训练神经网络时,除了随着step或者epoch观察损失函数的走势,从而建立对目前网络优化的基本认知外,也可以通过一些额外的可视化库来可视化我们的神经网络结构图。这将更加地高效地向读者展现目前的网络结构。
为了可视化神经网络,我们先建立一个简单的卷积层神经网络:
建立一个简单的卷积层神经网络:
- import torch
- import torch.nn as nn
-
- class ConvNet(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
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
输出网络结构
- 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)
- )
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
有了基本的神经网络后,我们分别通过HiddenLayer
和PyTorchViz
库来可视化上述的卷积层神经网络。
安装Graphviz工具,安装教程如下:
进入conda 的虚拟环境,输入
pip install hiddenlayer -i https://pypi.tuna.tsinghua.edu.cn/simple
绘制的基本程序如下:
- import hiddenlayer as h
- # import 请放在开头
- 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") # 保存图像的路径
结果如下
1.2 通过PyTorchViz可视化网络
根据上面的连接安装好后
这里我们只使用可视化函数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文件
生成图片:
观察我们的网络的每一步的损失函数或准确率的变化可以有效地帮助我们判断当前训练过程的优劣。如果能将这些过程可视化,那么我们判断的准确性和舒适性都会有所增加。
此处主要讲通过可视化神器tensorboardX
和刚刚用到的HiddenLayer
来实现训练过程的可视化。
为了训练网络,我们先导入训练网络需要的数据,此处就导入MNIST数据集,并做训练前的一些基本的数据处理。
- import torchvision
- import torch.utils.data as Data
- # 准备训练用的MNIST数据集
- train_data = 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
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
结果:
- test_data_x.shape: torch.Size([10000, 1, 28, 28])
- test_data_y.shape: torch.Size([10000])
- torch.Size([128, 1, 28, 28])
- torch.Size([128])
另外,还可以查询整个模型的参数量信息,代码如下(模型是A):
- import torch
- from torchvision.models import AlexNet
- from torchviz import make_dot
-
- x=torch.rand(8,3,256,512)
- model=AlexNet()
- y=model(x)
-
-
-
-
-
- # 查看模型的参数信息
-
- params = list(model.parameters())
- k = 0
- for i in params:
- l = 1
- print("该层的结构:" + str(list(i.size())))
- for j in i.size():
- l *= j
- print("该层参数和:" + str(l))
- k = k + l
- print("总参数数量和:" + str(k))
- '''
- 该层的结构:[64, 3, 11, 11]
- 该层参数和:23232
- 该层的结构:[64]
- 该层参数和:64
- 该层的结构:[192, 64, 5, 5]
- 该层参数和:307200
- 该层的结构:[192]
- 该层参数和:192
- 该层的结构:[384, 192, 3, 3]
- 该层参数和:663552
- 该层的结构:[384]
- 该层参数和:384
- 该层的结构:[256, 384, 3, 3]
- 该层参数和:884736
- 该层的结构:[256]
- 该层参数和:256
- 该层的结构:[256, 256, 3, 3]
- 该层参数和:589824
- 该层的结构:[256]
- 该层参数和:256
- 该层的结构:[4096, 9216]
- 该层参数和:37748736
- 该层的结构:[4096]
- 该层参数和:4096
- 该层的结构:[4096, 4096]
- 该层参数和:16777216
- 该层的结构:[4096]
- 该层参数和:4096
- 该层的结构:[1000, 4096]
- 该层参数和:4096000
- 该层的结构:[1000]
- 该层参数和:1000
- 总参数数量和:61100840
- '''
![](https://csdnimg.cn/release/blogv2/dist/pc/img/newCodeMoreWhite.png)
通过tensorwatch+jupyter notebook来实现
- import tensorwatch as tw
- import torchvision.models
-
- alexnet_model = torchvision.models.alexnet()
- tw.draw_model(alexnet_model, [1, 3, 224, 224])
pytorch 版本过高 会导致错误。
欢迎点赞、收藏、关注。
参考:
(44条消息) PyTorch下的可视化工具(网络结构/训练过程可视化)_3D视觉工坊的博客-CSDN博客
pytorch 网络结构可视化方法汇总(三种实现方法详解)_LoveMIss-Y的博客-CSDN博客_pytorch可视化
https://cxybb.com/article/sinat_37532065/103362517
https://www.its203.com/article/Wenyuanbo/118765044
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。