PyTorch可视化
1. 可视化网络结构
随着深度学习的发展,模型的网络结构越来越复杂,我们很难确定每一层的输入结果、输出结构和参数等信息,这样导致我们很难在短时间内完成debug。
这个时候可以通过可视化网络结构来帮助我们理解网络结构。其中在keras深度学习库中可以调用model.summary()
的API来很方便地实现,调用后就会显示我们的模型参数、输入大小、输出大小、模型的整体参数等。
而在PyTorch中,可以使用torchinfo工具包,接下来讲解torchinfo的相关使用。
1.1 模型基础信息
以torchvision中的resnet18为例,可以简单看一下模型的基础信息
import torchvision.models as models
model = models.resnet18()
# ResNet(
# (conv1): Conv2d(3, 64, kernel_size=(7, 7), stride=(2, 2), padding=(3, 3), bias=False)
# (bn1): BatchNorm2d(64, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)
# (relu): ReLU(inplace=True)
# (maxpool): MaxPool2d(kernel_size=3, stride=2, padding=1, dilation=1, ceil_mode=False)
# (layer1): Sequential(
# ...
# )
# (layer2): Sequential(
# ...
# )
# (layer3): Sequential(
# ...
# )
# (layer4): Sequential(
# ...
# )
# (avgpool): AdaptiveAvgPool2d(output_size=(1, 1))
# (fc): Linear(in_features=512, out_features=1000, bias=True)
# )
1.2 使用torchinfo可视化结构
示例代码如下:
from torchinfo import summary
import torchvision.models as models
resnet = models.resnet18()
summary(resnet, (1, 3, 224, 224))
其中,可以看到torchinfo提供了更加详细的信息,包括每个模块的信息(每一层的信息,输出shape和参数量)、模型总共参数量、模型大小、前向/反向传播需要的内存,参数内存、预估总共信息。
2. CNN可视化
卷积神经网络(CNN)是深度学习中非常重要的模型结构,它广泛地用于图像处理,极大地提升了模型表现,推动了计算机视觉地发展和进步。但CNN是一个“黑盒模型”,因此为了理解CNN的工作方式,引入了深度学习的可解释问题。
理解CNN的工作原理,人们不仅能够解释所获得的结果,提升模型的鲁棒性,还能针对性地改进CNN的结构以获得进一步的效果提升。
其中,可视化是一个理解模型结构的重要手段,比如可视化特征的提取、可视化提取的特征的形式、模型在输入数据的关注点等。
2.1 CNN卷积核可视化
卷积核在CNN中负责提取特征,可视化卷积核可以帮助理解CNN各个层提取什么样的特征,进而理解模型的工作原理。这里Zeiler和Fergus 2013年的paper研究了CNN各个层的卷积核的不同,他们发现靠近输入的层提取的特征是相对简单的结构,而靠近输出层提取的结构和图中的实体形状就相近了,如图:
可视化卷积核,本质上就是可视化对应的权重矩阵,这里以VGG11模型为例讲解PyTorch中可视化卷积核的实现方案:
# load model
import torch
from torchvision.models import vgg11
model = vgg11(pretrained=True)
dict(model.features.named_children())
卷积核对应的是卷积层(Conv2d),这里以第三层为例,可视化对应的参数:
conv1 = dict(model.features.named_children())['3']
kernel_set = conv1.weight.detach()
num = len(conv.weight.detach(