这篇是我对哔哩哔哩up主 @霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享
1和4是之前讲过的alexnet和resnet模型
2是分析中间层特征矩阵的脚本
3是查看卷积核参数的脚本
1设置预处理方法 和图像训练的时候用的预处理方法保持一致
2实例化模型
3载入之前的模型参数
4载入一张图片
5对图片进行预处理
6增加一个batch维度
7输入模型进行正向传播
如果print model可以看到模型信息:
模型虽然用的是alexnet,但是关于正向传播的代码做了一些修改:
因为我们目的是得到中间层的特征矩阵。
希望能遍历第一、第二、第三个卷积层并得到特征矩阵。
首先通过一个循环遍历我们features的层结构,通过named_children这个方法遍历features下面的所有层结构。
对于每一个层结构都用x=module(x)以实现正向传播的过程
回到analyze_feature_map.py
squeeze一下因为我们输入只有一个图片所以我们不需要N这个维度
然后transpose一下通道顺序
im[:,:,i]通过切片的方法获取每一个channel的特征矩阵
cmap='gray'表示用灰度图的方法来表示
如果不加这个,那默认就会用蓝色和绿色来替代灰度图的黑色和白色来展示
这就是我们第一个卷积层输出的特征矩阵的前12个通道的特征图
可以和原图对比一下:
卷积层2所输出的特征矩阵:
可以看到有的通道是纯黑的,也就是说有的卷积核是没有起到任何作用的,就是没有学到东西
卷积层越往后抽象程度越高
如果不加cmap=gray:
接下来我们看一下如何查看网络卷积层的卷积核的信息
我们其实可以直接通过torch.load载入模型参数,返回的是一个dict字典形式,key是层名称value就是该层的训练信息。
state_dict() 来获取模型中所有可训练参数的字典keys()获取所有具有参数的层结构的名称
只有卷积层有训练参数,relu和maxpool2d是没有训练参数的
卷积核的个数对应输出矩阵的深度
卷积核的通道数对应输入矩阵的深度
这一句是为了排除编程结构的一些不需要的信息
另外,如果B站视频分辨率不太好,感觉跟全屏时的清晰度差很多,但是不全屏的话就截图都截不清楚,那么就拖拽网页页面左右划拉一下试试,就会变清晰