当前位置:   article > 正文

Torch网络结构/训练过程可视化_torch可视化

torch可视化

一、网络结构的可视化

我们训练神经网络时,除了随着step或者epoch观察损失函数的走势,从而建立对目前网络优化的基本认知外,也可以通过一些额外的可视化库来可视化我们的神经网络结构图。这将更加地高效地向读者展现目前的网络结构。

为了可视化神经网络,我们先建立一个简单的卷积层神经网络:

建立一个简单的卷积层神经网络:

  1. import torch
  2. import torch.nn as nn
  3. class ConvNet(nn.Module):
  4. def __init__(self):
  5. super(ConvNet, self).__init__()
  6. self.conv1 = nn.Sequential(
  7. nn.Conv2d(1, 16, 3, 1, 1),
  8. nn.ReLU(),
  9. nn.AvgPool2d(2, 2)
  10. )
  11. self.conv2 = nn.Sequential(
  12. nn.Conv2d(16, 32, 3, 1, 1),
  13. nn.ReLU(),
  14. nn.MaxPool2d(2, 2)
  15. )
  16. self.fc = nn.Sequential(
  17. nn.Linear(32 * 7 * 7, 128),
  18. nn.ReLU(),
  19. nn.Linear(128, 64),
  20. nn.ReLU()
  21. )
  22. self.out = nn.Linear(64, 10)
  23. def forward(self, x):
  24. x = self.conv1(x)
  25. x = self.conv2(x)
  26. x = x.view(x.size(0), -1)
  27. x = self.fc(x)
  28. output = self.out(x)
  29. return output

 输出网络结构

  1. MyConvNet = ConvNet()
  2. print(MyConvNet)

 输出结果:

  1. ConvNet(
  2. (conv1): Sequential(
  3. (0): Conv2d(1, 16, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  4. (1): ReLU()
  5. (2): AvgPool2d(kernel_size=2, stride=2, padding=0)
  6. )
  7. (conv2): Sequential(
  8. (0): Conv2d(16, 32, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1))
  9. (1): ReLU()
  10. (2): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)
  11. )
  12. (fc): Sequential(
  13. (0): Linear(in_features=1568, out_features=128, bias=True)
  14. (1): ReLU()
  15. (2): Linear(in_features=128, out_features=64, bias=True)
  16. (3): ReLU()
  17. )
  18. (out): Linear(in_features=64, out_features=10, bias=True)
  19. )

 有了基本的神经网络后,我们分别通过HiddenLayerPyTorchViz库来可视化上述的卷积层神经网络。

安装Graphviz工具,安装教程如下:

(83条消息) [pytorch]:graphviz.backend.execute.ExecutableNotFound: failed to execute WindowsPath(‘dot‘),_Vertira的博客-CSDN博客

1.1 通过HiddenLayer可视化网络

进入conda 的虚拟环境,输入

pip install hiddenlayer -i https://pypi.tuna.tsinghua.edu.cn/simple

 绘制的基本程序如下:

  1. import hiddenlayer as h
  2. # import 请放在开头
  3. vis_graph = h.build_graph(MyConvNet, torch.zeros([1 ,1, 28, 28])) # 获取绘制图像的对象
  4. vis_graph.theme = h.graph.THEMES["blue"].copy() # 指定主题颜色
  5. vis_graph.save("./demo1.png") # 保存图像的路径

结果如下

 1.2 通过PyTorchViz可视化网络

 根据上面的连接安装好后

这里我们只使用可视化函数make_dot()来获取绘图对象,基本使用和HiddenLayer差不多,不同的地方在于PyTorch绘图之前可以指定一个网络的输入值和预测值。

  1. from torchviz import make_dot
  2. x = torch.randn(1, 1, 28, 28).requires_grad_(True) # 定义一个网络的输入值
  3. y = MyConvNet(x) # 获取网络的预测值
  4. MyConvNetVis = make_dot(y, params=dict(list(MyConvNet.named_parameters()) + [('x', x)]))
  5. MyConvNetVis.format = "png"
  6. # 指定文件生成的文件夹
  7. MyConvNetVis.directory = "data"
  8. # 生成文件
  9. MyConvNetVis.view()

 打开与上述代码相同根目录下的data文件夹,里面会有一个.gv文件和一个.png文件,其中的.gv文件是Graphviz工具生成图片的脚本代码,.png.gv文件编译生成的图片,直接打开.png文件就行。

默认情况下,上述程序运行后会自动打开.png文件 

生成图片:

二、训练过程可视化

观察我们的网络的每一步的损失函数或准确率的变化可以有效地帮助我们判断当前训练过程的优劣。如果能将这些过程可视化,那么我们判断的准确性和舒适性都会有所增加。

此处主要讲通过可视化神器tensorboardX和刚刚用到的HiddenLayer来实现训练过程的可视化。

为了训练网络,我们先导入训练网络需要的数据,此处就导入MNIST数据集,并做训练前的一些基本的数据处理。

  1. import torchvision
  2. import torch.utils.data as Data
  3. # 准备训练用的MNIST数据集
  4. train_data = torchvision.datasets.MNIST(
  5. root = "./data/MNIST", # 提取数据的路径
  6. train=True, # 使用MNIST内的训练数据
  7. transform=torchvision.transforms.ToTensor(), # 转换成torch.tensor
  8. download=False # 如果是第一次运行的话,置为True,表示下载数据集到root目录
  9. )
  10. # 定义loader
  11. train_loader = Data.DataLoader(
  12. dataset=train_data,
  13. batch_size=128,
  14. shuffle=True,
  15. num_workers=0
  16. )
  17. test_data = torchvision.datasets.MNIST(
  18. root="./data/MNIST",
  19. train=False, # 使用测试数据
  20. download=False
  21. )
  22. # 将测试数据压缩到0-1
  23. test_data_x = test_data.data.type(torch.FloatTensor) / 255.0
  24. test_data_x = torch.unsqueeze(test_data_x, dim=1)
  25. test_data_y = test_data.targets
  26. # 打印一下测试数据和训练数据的shape
  27. print("test_data_x.shape:", test_data_x.shape)
  28. print("test_data_y.shape:", test_data_y.shape)
  29. for x, y in train_loader:
  30. print(x.shape)
  31. print(y.shape)
  32. break

 结果:

  1. test_data_x.shape: torch.Size([10000, 1, 28, 28])
  2. test_data_y.shape: torch.Size([10000])
  3. torch.Size([128, 1, 28, 28])
  4. torch.Size([128])

另外,还可以查询整个模型的参数量信息,代码如下(模型是A):

  1. import torch
  2. from torchvision.models import AlexNet
  3. from torchviz import make_dot
  4. x=torch.rand(8,3,256,512)
  5. model=AlexNet()
  6. y=model(x)
  7. # 查看模型的参数信息
  8. params = list(model.parameters())
  9. k = 0
  10. for i in params:
  11. l = 1
  12. print("该层的结构:" + str(list(i.size())))
  13. for j in i.size():
  14. l *= j
  15. print("该层参数和:" + str(l))
  16. k = k + l
  17. print("总参数数量和:" + str(k))
  18. '''
  19. 该层的结构:[64, 3, 11, 11]
  20. 该层参数和:23232
  21. 该层的结构:[64]
  22. 该层参数和:64
  23. 该层的结构:[192, 64, 5, 5]
  24. 该层参数和:307200
  25. 该层的结构:[192]
  26. 该层参数和:192
  27. 该层的结构:[384, 192, 3, 3]
  28. 该层参数和:663552
  29. 该层的结构:[384]
  30. 该层参数和:384
  31. 该层的结构:[256, 384, 3, 3]
  32. 该层参数和:884736
  33. 该层的结构:[256]
  34. 该层参数和:256
  35. 该层的结构:[256, 256, 3, 3]
  36. 该层参数和:589824
  37. 该层的结构:[256]
  38. 该层参数和:256
  39. 该层的结构:[4096, 9216]
  40. 该层参数和:37748736
  41. 该层的结构:[4096]
  42. 该层参数和:4096
  43. 该层的结构:[4096, 4096]
  44. 该层参数和:16777216
  45. 该层的结构:[4096]
  46. 该层参数和:4096
  47. 该层的结构:[1000, 4096]
  48. 该层参数和:4096000
  49. 该层的结构:[1000]
  50. 该层参数和:1000
  51. 总参数数量和:61100840
  52. '''

通过tensorwatch+jupyter notebook来实现

  1. import tensorwatch as tw
  2. import torchvision.models
  3. alexnet_model = torchvision.models.alexnet()
  4. tw.draw_model(alexnet_model, [1, 3, 224, 224])

 pytorch 版本过高 会导致错误。

欢迎点赞收藏关注

参考:

(44条消息) PyTorch下的可视化工具(网络结构/训练过程可视化)_3D视觉工坊的博客-CSDN博客

 

pytorch 网络结构可视化方法汇总(三种实现方法详解)_LoveMIss-Y的博客-CSDN博客_pytorch可视化

PyTorch下的可视化工具 - 知乎

Pytorch网络可视化 - 知乎

https://cxybb.com/article/sinat_37532065/103362517

https://www.its203.com/article/Wenyuanbo/118765044
 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/514461
推荐阅读
相关标签
  

闽ICP备14008679号