第十九章 解读利用pytorch可视化特征图以及卷积核参数(工具)

介绍一种可视化feaature maps以及kernel weights的方法

推荐可视化工具TensorBoard:可以查看整个计算图的数据流向,保存再训练过程中的损失信息,准确率信息等

学习视频:

使用pytorch查看中间层特征矩阵以及卷积核参数_哔哩哔哩_bilibili

代码下载:

deep-learning-for-image-processing/pytorch_classification/analyze_weights_featuremap at master · WZMIAOMIAO/deep-learning-for-image-processing · GitHub

一、所需文件

AlexNet.pth 和 resNet34.pth 文件通过之前的训练获得

二、操作步骤

AlexNet 的中间层特征矩阵

1.在analyze_feature_map.py 文件的 out_put 处设置断点并debug,查看print model所打印的信息

  1. 打印两个层结构:第一个是features,第二个是classifier,与 alexnet_model.py文件中的所定义的层结构一一对应,如下图所示:
  1. 在 alexnet_model.py 文件的 for name, module in self.features.named_children(): 行设置断点并单步运行

得到name = 0 和卷积层conv 2d,后面以此类推

  1. 让程序接着运行到for循环处

查看out_put,是一个list,一共有三层,分别对应第一个,第二个,第三个卷积层的输出特征矩阵

5.让程序执行完

(1)输出为第一个卷积层 所输出的特征矩阵的前12个通道的特征图

通过特征图的明暗程度来理解卷积层一所关注的一些信息,亮度越高的地方就是卷积层越感兴趣的地方。

原图如下:

(2)卷积层二所输出的特征矩阵:抽象程度越来越高,有些卷积核没有起到作用

卷积层三 所输出的特征矩阵

(3)去掉cmap='gray'之后的颜色为蓝绿色

(4)如果想看更多信息,则在 alexnet_model.py 的向前传播过程中进行修改

假如要看全连接层的图像,则也要将输入的图像通过features层结构,再通过全连接层才能查看

resnet34 的中间层特征矩阵

1.修改代码并再下图处设置断点debug

可以再终端看到resnet的层结构

2.运行结果如图

明显resnet学习到的信息比 alexnet更多

有两个原因:resnet确实比alexnet更加优秀

​ resnet使用迁移学习的方法,并且预训练数据集是使用 imagenet 数据集进行训练的

3.layer1所输出的特征矩阵,明显比alexnet好很多,每一个特征层都有输出,都是有用的

AlexNet 的卷积核参数

  1. 打开 analyze_kernel_weight.py 文件

这里可以不用实例化模型,直接通过 torch.load 函数载入训练权重,因为通过 torch.load 载入后,就是一个字典类型,它的key就代表每个层结构的名称,对应的value就是每层的训练信息

  1. 通过 model.state_dict 函数获取模型中所有的可训练参数的字典,再通过keys方法获取所有的具有参数的层结构的名称

单步运行看一下weights_keys

如下图所示,weights_keys 是一个有序的keys,按照正向传播过程的顺序进行保存的

命名规则:

​ feature0,feature3,feature6,feature8,feature10等卷积层才有训练参数

​ 激活函数和最大池化下采样是没有激活函数的

3.接下来遍历 weights_keys

model.state_dict 函数获取模型中所有的可训练参数的字典信息,传入对应的key就得到了参数信息,再通过numpy方法将权值信息转化为numpy格式,方便分析

注意:卷积核通道的排列顺序是

​ kernel_number 卷积核个数,对应的输出特征矩阵的深度

​ kernel_channel 卷积核深度,对应的输入特征矩阵的深度

​ kernel_height, kernel_width,卷积核的高度和宽度

  1. 获得信息
cobol 复制代码
    # k = weight_t[0, :, :, :]  # 通过切片的方式获得信息

 

    # calculate mean, std, min, max    对所有卷积核的信息进行计算
    weight_mean = weight_t.mean()      #均值
    weight_std = weight_t.std(ddof=1)  #标准差
    weight_min = weight_t.min()        #最小值
    weight_max = weight_t.max()        #最大值

卷积层一对应的卷积核值的分布

卷积层一对应的偏置的分布

后面的都是一样的,不做展示

ResNet 的卷积核参数

1.第一个卷积层的分布

2.bn层的分布,使用bn时就不用使用偏置

weight就是下图的 参数

bias对应上图的 参数

mean对应的是均值 ,是统计得到的

方差 也是统计得到的

后面的输出都是一样的结构。

相关推荐
雪隐2 分钟前
用Flutter做背单词APP-03为了给单词库塞满数据,我让AI给我打了上万份工
前端·人工智能·后端
梦想不只是梦与想3 分钟前
OmegaConf 配置管理库的使用
python·omegaconf·结构化配置
weixin_446260856 分钟前
WebSwarm:面向深度+广度混合网页搜索的递归多智能体编排框架
人工智能
网易云信7 分钟前
抢先剧透!网易智企即将亮相 2026 WAIC,这次我们带来了什么?
人工智能·aigc·线下活动
学究天人9 分钟前
数学公理体系大全:第六章 选择公理的等价形式及证明
人工智能·线性代数·算法·机器学习·数学建模·概率论·原型模式
写代码像蔡徐抻11 分钟前
大模型进化到头了吗?看看 Anthropic 自己押注的下一代路线
人工智能
STLearner12 分钟前
ICML 2026 | 时间序列(Time Series)论文总结(3)【因果,可解释性,不规则时序,表示学习,benchmar
大数据·论文阅读·人工智能·深度学习·神经网络·机器学习
武子康14 分钟前
🔥 多 GPU 推理决策顺序全解:单卡 → DP → TP → PP → EP 怎么选(vLLM/TensorRT-LLM/SGLang)
人工智能·llm·openai
阿虎儿18 分钟前
dify Agent插件报错:save data failed: allocated size is greater than max storage size
人工智能
ZZZMMM.zip26 分钟前
鸿蒙生态新征程:基于鸿蒙Flutter框架的AI菜谱营养应用深度解析
人工智能·flutter·华为·harmonyos·鸿蒙·鸿蒙系统