第十九章 解读利用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对应的是均值 ,是统计得到的

方差 也是统计得到的

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

相关推荐
小陈工1 小时前
Python Web开发入门(十七):Vue.js与Python后端集成——让前后端真正“握手言和“
开发语言·前端·javascript·数据库·vue.js·人工智能·python
A__tao5 小时前
Elasticsearch Mapping 一键生成 Java 实体类(支持嵌套 + 自动过滤注释)
java·python·elasticsearch
墨染天姬5 小时前
【AI】端侧AIBOX可以部署哪些智能体
人工智能
研究点啥好呢5 小时前
Github热门项目推荐 | 创建你的像素风格!
c++·python·node.js·github·开源软件
AI成长日志5 小时前
【Agentic RL】1.1 什么是Agentic RL:从传统RL到智能体学习
人工智能·学习·算法
2501_948114246 小时前
2026年大模型API聚合平台技术评测:企业级接入层的治理演进与星链4SAPI架构观察
大数据·人工智能·gpt·架构·claude
小小工匠6 小时前
LLM - awesome-design-md 从 DESIGN.md 到“可对话的设计系统”:用纯文本驱动 AI 生成一致 UI 的新范式
人工智能·ui
迷藏4946 小时前
**发散创新:基于Rust实现的开源合规权限管理框架设计与实践**在现代软件架构中,**权限控制(RBAC)** 已成为保障
java·开发语言·python·rust·开源
黎阳之光6 小时前
黎阳之光:视频孪生领跑者,铸就中国数字科技全球竞争力
大数据·人工智能·算法·安全·数字孪生
小超同学你好6 小时前
面向 LLM 的程序设计 6:Tool Calling 的完整生命周期——从定义、决策、执行到观测回注
人工智能·语言模型