六月份组队学习【深入浅出PyTorch】Task05打卡笔记
时间:2024-01-05 08:07:01
这个吃瓜教程是Datawhale组织团队学习 。
学习资料由开源学习组织Datawhale提供。
开源贡献:李嘉琪、牛志康、刘洋、陈安东、陈玉立、刘兴、郭棉升、乔斌、匡俊伟
笔记的分来自网络检索。如果有侵权联系,可以删除
本研究的对象:
具有高数、线代、概率论的基础,具有一定的机器学习和深度学习基础,熟悉常见概念Python。
内容说明:PyTorch从基础知识到项目实战,理论与实践相结合。
学习周期:14天
教程链接:https://datawhalechina.github.io/thorough-pytorch/index.html
B站视频:BV1L44y1472Z
学习者手册:https://mp.weixin.qq.com/s/pwWg0w1DL2C1i_Hs3SZedg
Task05学习内容
- 第七章 pytorch可视化
-
- 7.1 可视化网络结构
-
- ResNet18
- torchinfo的安装
- torchinfo的使用
- 7.2 CNN可视化
-
- 可视化CNN卷积核的方法
-
- VGG11模型网络结构
第七章 pytorch可视化
第七章的主要学习内容是学习如何构建可视化网络,使用它torchinfo工具包。
7.1 可视化网络结构
使用ResNet展示18个结构:
ResNet18
上图是ResNet18的结构列表
torchinfo的安装
#安装方法一 pip install torchinfo #安装方法二 conda install -c conda-forge torchinfo
torchinfo的使用
import torchvision.models as models from torchinfo import summary resnet18 = models.resnet18() # 实例化模型 summary(resnet18, (1, 3, 224, 224)) # 1:batch_size 3:图片的通道数 224: 图片的高宽
7.2 CNN可视化
第二节围绕在内pytorch下搭建CNN模型的可视化过程
可视化CNN卷积核的方法
PyTorch可视化卷积核也很方便,核心在于特定层的卷积核是特定层的模型权重,可视化卷积核等同于可视化对应的权重矩阵。torchvision自带的VGG11模型为例。
VGG11模型网络结构
import torch from torchvision.models import vgg11 model = vgg11(pretrained=True) print(dict(model.features.named_children()))
#确认层信息 {
'0': Conv2d(3, 64, kernel_size=(3, 3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'1'
:
ReLU
(inplace
=True
)
,
'2'
:
MaxPool2d
(kernel_size
=
2
, stride
=
2
, padding
=
0
, dilation
=
1
, ceil_mode
=False
)
,
'3'
:
Conv2d
(
64
,
128
, kernel_size
=
(
3
,
3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'4'
:
ReLU
(inplace
=True
)
,
'5'
:
MaxPool2d
(kernel_size
=
2
, stride
=
2
, padding
=
0
, dilation
=
1
, ceil_mode
=False
)
,
'6'
:
Conv2d
(
128
,
256
, kernel_size
=
(
3
,
3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'7'
:
ReLU
(inplace
=True
)
,
'8'
:
Conv2d
(
256
,
256
, kernel_size
=
(
3
,
3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'9'
:
ReLU
(inplace
=True
)
,
'10'
:
MaxPool2d
(kernel_size
=
2
, stride
=
2
, padding
=
0
, dilation
=
1
, ceil_mode
=False
)
,
'11'
:
Conv2d
(
256
,
512
, kernel_size
=
(
3
,
3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'12'
:
ReLU
(inplace
=True
)
,
'13'
:
Conv2d
(
512
,
512
, kernel_size
=
(
3
,
3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'14'
:
ReLU
(inplace
=True
)
,
'15'
:
MaxPool2d
(kernel_size
=
2
, stride
=
2
, padding
=
0
, dilation
=
1
, ceil_mode
=False
)
,
'16'
:
Conv2d
(
512
,
512
, kernel_size
=
(
3
,
3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'17'
:
ReLU
(inplace
=True
)
,
'18'
:
Conv2d
(
512
,
512
, kernel_size
=
(
3
,
3
)
, stride
=
(
1
,
1
)
, padding
=
(
1
,
1
)
)
,
'19'
:
ReLU
(inplace
=True
)
,
'20'
:
MaxPool2d
(kernel_size
=
2
, stride
=
2
, padding
=
0
, dilation
=
1
, ceil_mode
=False
)
}
卷积核对应的应为卷积层(Conv2d),这里以第“3”层为例,可视化对应的参数:
conv1 = dict(model.features.named_children())['3']
kernel_set = conv1.weight.detach()
num = len(conv1.weight.detach())
print(kernel_set.shape)
for i in range(0,num):
i_kernel = kernel_set[i]
plt.figure(figsize=(20, 17))
if (len(i_kernel)) > 1:
for idx, filer in enumerate(i_kernel):
plt.subplot(9, 9, idx+1)
plt.axis('off')
plt.imshow(filer[ :, :].detach(),cmap='bwr')
torch.Size([128, 64, 3, 3])