上一节中完成了基于PyTorch 2.0的MNIST模型的设计,并完成了MNIST手写体的识别。此时,可能会有读者对我们自己设计的模型结构感到好奇,如果有一种能够可视化模型结构的现成方法,用起来就非常方便了。
为了解决模型结构的展示问题,PyTorch官方提供了对应的建议模型打印工具,即直接调用print函数来完成,例如对上一节中我们实现的MNIST模型:
class NeuralNetwork(nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.flatten = nn.Flatten() self.linear_relu_stack = nn.Sequential( nn.Linear(28*28,312), nn.ReLU(), nn.Linear(312, 256), nn.ReLU(), nn.Linear(256, 10) ) def forward(self, input): x = self.flatten(input) logits = self.linear_relu_stack(x) return logits
读者可以直接使用如下函数完成模型参数的打印:
if __name__ == '__main__': model = NeuralNetwork() print(model)
打印结果如图3-5所示。
图3-5 对模型具体使用的函数及其对应的参数进行打印
可以看到此结果是对模型具体使用的函数及其对应的参数进行打印。
为了更进一步简化对模型参数的打印,读者可以使用作者提供的对参数和结构进行打印的函数,代码如下所示:
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))
运行完此段代码后,可以对每层的节点输出和参数总量进行打印,结果如图3-6所示。
图3-6 对每层的节点输出和参数总量进行打印
上一小节讲解了模型结构的输出,但是相对于简单的文本化输出方式,PyTorch第三方提供了许多具有直观表示的模型可视化展示方式。netron就是一个深度学习模型可视化库,支持可视化表示PyTorch 2.0的模型存档文件。我们可以将上一小节中PyTorch的模型结构进行保存,并通过netron进行可视化展示。模型保存代码如下所示:
import torch device = "cuda" #在这里默认使用GPU,如果出现运行问题可以将其改成cpu模式 #设定的多层感知机网络模型 class NeuralNetwork(torch.nn.Module): def __init__(self): super(NeuralNetwork, self).__init__() self.flatten = torch.nn.Flatten() self.linear_relu_stack = torch.nn.Sequential( torch.nn.Linear(28*28,312), torch.nn.ReLU(), torch.nn.Linear(312, 256), torch.nn.ReLU(), torch.nn.Linear(256, 10) ) def forward(self, input): x = self.flatten(input) logits = self.linear_relu_stack(x) return logits #进行模型的保存 model = NeuralNetwork() torch.save(model, './model.pth') #将模型保存为.pth文件
读者可以自行百度netron的下载地址,建议从GitHub上下载netron,其主页上也提供了不同版本的安装方式,如图3-7所示。
图3-7 netron不同版本的安装方式
读者可以依照自己的操作系统下载对应的文件,在这里安装的是基于Windows的exe文件,安装运行后会出现一个图形界面,直接在界面上点击file操作符号,打开我们刚才保存的pth文件,显示结果如图3-8所示。
图3-8 打开model.pth的显示结果
可以看到,此时model.pth的模型结构被可视化展示出来,每个模块输入输出维度在图上都有展示,点击带颜色的部分可以看到每个模块更详细的说明,如图3-9所示。
图3-9 每个模块更详细的说明
感兴趣的读者可以自行安装测试。
除了上面介绍的netron工具,还有更多的PyTorch可视化工具,有兴趣的读者可以根据需要选择合适的可视化工具来使用。
torchsummary会输出网络模型的过程层结构、层参数和总参数等信息。对于大多数新手和“深度学习炼丹师”关注具体的层间参数信息没有太大意义,但是torchsummary可以很方便地用来获取网络参数量和输出模型大小,效果如图3-10所示。
图3-10 torchsummary获取网络参数量和输出模型大小
hiddenlayer是比较实用的一种网络可视化方法,功能也相对比较多,输出的网络结构图比较直观,细节也相对丰富。hiddenlayer输出的网络结构例子如图3-11所示。
图3-11 hiddenlayer输出的网络结构
PlotNeuralNet可以利用Python将.py文件中定义的网络结构转换为.tex文件,并生成相应图形,实际上这里的网络结构与自己训练或者测试的网络结构没有太大关系。PlotNeuralNet上手难度较大,其输出的网络结构示例如图3-12所示。
图3-12 PlotNeuralNet输出的网络结构
torchvision是PyTorch的一个图形库,它服务于PyTorch深度学习框架,主要用来构建计算机视觉模型,其使用效果如图3-13所示。
图3-13 torchvision输出的网络结构
以上4种以及上一小节介绍的netron是较为常用的可视化工具。针对PyTorch 2.0的模型可视化工具,读者可以选择适合自己需要的工具来学习。