Python Day46
Task:
1.不同CNN层的特征图:不同通道的特征图
2.什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。
3.通道注意力:模型的定义和插入的位置
4.通道注意力后的特征图和热力图
1. 不同CNN层的特征图:不同通道的特征图
什么是特征图 (Feature Map)?
在卷积神经网络 (CNN) 中,特征图是卷积层(或池化层、激活层)的输出。它是一个三维张量 (Tensor),通常表示为 [高度 H, 宽度 W, 通道数 C]
。
- 高度 (H) 和 宽度 (W):对应于输入图像的局部区域,表示该区域检测到的特征的空间位置。
- 通道数 ©:表示该层提取到的特征的数量。每个通道都是一个二维的“激活图 (Activation Map)”,对应于一个特定的卷积核(或滤波器)检测到的某种特征模式。
不同CNN层的特征图:
- 浅层 (Early Layers):
- 特点:特征图的尺寸(H, W)通常较大,通道数可能相对较少。
- 内容:这些层提取的是低级(Low-level)特征,例如边缘(水平、垂直、对角)、纹理、颜色斑块等。
- 例子:一个浅层可能有一个通道专门检测水平边缘,另一个通道检测垂直边缘,等等。这些特征图上的高激活值表示在对应位置检测到了这种特定的低级特征。
- 深层 (Deep Layers):
- 特点:经过多层卷积和池化后,特征图的尺寸(H, W)通常会变小,但通道数会大幅增加。
- 内容:这些层提取的是高级(High-level)语义特征,它们是浅层特征的组合和抽象。例如,深层可能识别出眼睛、鼻子、车轮、猫的身体等“部件”,甚至更高层能识别出“一张人脸”、“一辆汽车”、“一只猫”等完整的概念。
- 例子:一个深层通道可能对“狗的耳朵”特征有高激活,另一个对“猫的胡须”有高激活。这些复杂的特征是在更抽象的层面上描述图像内容。
不同通道的特征图:
在一个卷积层的输出特征图 [H, W, C]
中,C
个通道中的每一个通道(即 [H, W]
的二维切片)都代表了由一个特定的卷积核检测到的一种特定的特征模式。
- 想象一下有C个不同的“探测器”,每个探测器都在图像的每个位置寻找一种特定的东西。
- 例如,在识别猫的图像中:
- 通道1可能对“尖耳朵”特征有高激活。
- 通道2可能对“细长胡须”特征有高激活。
- 通道3可能对“特定毛发纹理”特征有高激活。
- …等等。
- 因此,不同的通道捕捉的是图像中不同类型、不同语义信息的特征。这些通道共同构成了该层对输入图像的完整理解。
2. 什么是注意力 (Attention)
核心思想:注意力机制模仿了人类视觉和认知系统的一个关键能力——在处理信息时,能够有选择地聚焦于最相关、最重要的部分,同时抑制不相关或次要的部分。
目的:在神经网络中引入注意力,是为了让模型能够:
- 更有效地利用信息:让模型知道“应该看哪里”或“应该关注哪些特征”。
- 提高性能:通过聚焦重要信息,减少噪音干扰,从而提升模型的准确性和鲁棒性。
- 增强可解释性:有时,注意力权重可以指示模型在做出决策时,哪些输入区域或特征是关键的。
“注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。”
这个比喻非常恰当!
- 动物园:意味着注意力机制并非单一的一种算法,而是一个庞大而多样化的家族。
- 不同的模块:包括但不限于:
- 通道注意力 (Channel Attention):关注不同特征通道的重要性。
- 空间注意力 (Spatial Attention):关注特征图不同空间位置的重要性。
- 混合注意力 (Hybrid Attention):结合通道和空间注意力。
- 自注意力 (Self-Attention):在序列数据(如Transformer)中尤为重要,通过计算序列中不同元素之间的关系来分配注意力。
- 跨模态注意力 (Cross-Modal Attention):处理不同类型数据(如图像和文本)之间的关系。
- 好不好试了才知道:由于不同的任务、不同的数据集和不同的模型架构对注意力的需求不同,没有一种注意力机制是“万能”的。一种在某个任务上表现出色的注意力模块,在另一个任务上可能效果平平。因此,研究人员和工程师通常需要根据具体场景,通过实验来验证哪种注意力机制最有效。
3. 通道注意力 (Channel Attention):模型的定义和插入的位置
定义:
通道注意力机制旨在动态地调整不同特征通道的重要性。它通过学习一个权重向量,为每个特征通道分配一个0到1之间的标量权重。这个权重表示了该通道的特征对于当前任务(例如图像分类、目标检测等)的贡献程度。权重越高,表示该通道越重要,其激活值会被放大;权重越低,表示该通道越不重要,其激活值会被抑制。
典型实现:
最著名的通道注意力模块是 Squeeze-and-Excitation (SE) Block,由Hu等人于2017年提出。
SE Block的工作流程:
-
Squeeze (挤压):
- 输入:一个特征图
X
,维度为[H, W, C]
。 - 操作:对每个通道执行全局平均池化 (Global Average Pooling, GAP)。这将每个
[H, W]
的2D通道压缩成一个单一的数值。 - 输出:一个
[1, 1, C]
的特征向量。这个向量的每个元素代表了对应通道的全局信息(例如,该通道的平均激活强度),可以看作是该通道的“全局描述子”。
- 输入:一个特征图
-
Excitation (激励):
- 输入:Squeeze步骤得到的
[1, 1, C]
全局描述子。 - 操作:
- 通过一个全连接层 (Fully Connected Layer) 将
C
维向量降维到C/r
维(r
是缩减率,通常为16)。这是一个“瓶颈”结构,用于减少模型参数和计算量。 - 再通过另一个全连接层将
C/r
维向量恢复到C
维。 - 最后,通过一个 Sigmoid 激活函数 将输出值归一化到
[0, 1]
之间。
- 通过一个全连接层 (Fully Connected Layer) 将
- 输出:一个
[1, 1, C]
的权重向量s
,其中每个元素s_c
是对应通道的权重。这些权重表示了模型学习到的每个通道的重要性。
- 输入:Squeeze步骤得到的
-
Scale (缩放):
- 输入:原始特征图
X
([H, W, C]
) 和学习到的权重向量s
([1, 1, C]
)。 - 操作:将
s
中的每个权重s_c
与原始特征图X
中对应的通道X_c
进行逐元素相乘 (element-wise multiplication)。 - 输出:通道加权后的特征图
X'
([H, W, C]
)。
- 输入:原始特征图
通过这个过程,SE Block 学习到了每个特征通道的“重要性”,并用这些权重来强化重要的通道,弱化不重要的通道。
插入的位置:
通道注意力模块通常被插入在:
- 卷积块之后 (After Convolution Blocks):在标准的卷积层(或一系列卷积层,如ResNet中的残差块)的输出之后,但在下一个主要操作(如池化层、另一个卷积块或最终分类层)之前。
- 残差块内部 (Within Residual Blocks):在像ResNet这样的网络中,SE Block可以非常自然地集成到残差块的跳跃连接之前或之后,以优化每个残差学习的特征。例如,在ResNet的每个bottleneck block的卷积操作之后、ReLU激活之前,或者直接在ReLU之后。
它通常作为一种即插即用 (Plug-and-Play) 的模块,可以轻松地添加到现有网络架构中,而无需对整个网络进行大幅度的修改。
4. 通道注意力后的特征图和热力图
通道注意力后的特征图 (Feature Map after Channel Attention):
通道注意力模块的直接输出仍然是一个特征图,其维度与输入特征图相同 [H, W, C]
。
所不同的是,这个新的特征图 X'
中的每个通道的激活值都被相应的注意力权重 s_c
进行了加权调整:
X'_c(i, j) = X_c(i, j) * s_c
其中 X'_c(i, j)
是加权后特征图在通道 c
的位置 (i, j)
的值,X_c(i, j)
是原始特征图对应的值,s_c
是通道 c
的注意力权重。
效果:
- 如果某个通道的权重
s_c
接近1,表示该通道非常重要,其特征值基本保持不变或略微增强。 - 如果某个通道的权重
s_c
接近0,表示该通道不重要,其特征值会被大幅度抑制,接近于0。 - 这样,模型在后续处理中会更加关注那些被强化的、重要的特征通道,从而提升对关键信息的感知能力。
与热力图 (Heatmap) 的关系:
“热力图”通常指的是空间注意力图 (Spatial Attention Map) 或 类激活映射 (Class Activation Map, CAM),它以可视化的方式显示输入图像中哪些区域对模型的决策贡献最大。通道注意力本身并不直接生成一个显示输入图像空间重要性的热力图。
然而,通道注意力对“热力图”的影响体现在:
-
间接影响下游特征图的语义:
- 通道注意力通过增强对任务更重要的特征通道(例如,与特定类别相关的部件特征)和抑制不重要的通道,实际上是在引导模型内部的信息流。
- 当这些经过通道加权调整的特征图继续传播到网络的更深层时,它们将携带更聚焦、更具判别性的信息。
-
改善最终生成的类激活热力图 (CAM/Grad-CAM):
- 当结合通道注意力机制的网络用于生成CAM或Grad-CAM时,由于网络在内部已经学习了哪些特征是重要的,所以生成的CAM通常会更准确地聚焦于目标对象或其关键部分。
- 举例来说,如果没有通道注意力,网络可能对狗的毛发纹理和背景草地都分配了一定的关注。而有了通道注意力,它可能学会了在识别狗时,毛发纹理这个通道比草地纹理通道更重要,从而在生成的CAM中,狗的身体区域会显示出更强的激活,而背景区域的激活会被抑制。
总结:
- 通道注意力后的特征图:是原始特征图经过通道维度上的加权调整,强调了重要的特征通道,抑制了不重要的特征通道。
- 热力图:通常是空间上的可视化。通道注意力不直接产生空间热力图,但它通过优化特征通道的重要性,能够间接且有效地提升最终生成的空间热力图的准确性和聚焦能力,使其更能反映模型对图像关键区域的关注。
- 当然,以下是一个示例代码,演示如何在PyTorch框架中对比不同卷积层的特征图可视化。这个示例以ResNet模型为例,展示如何提取并可视化第1层、第2层和第3层卷积输出的特征图。
代码:对比不同卷积层特征图可视化(PyTorch)
import torch
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np# 定义设备
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 加载预训练模型(如ResNet18)
model = torchvision.models.resnet18(pretrained=True).to(device)
model.eval()# 选定需要可视化的层
# 这里使用ResNet的层,具体以layer1[0], layer2[0], layer3[0]为例
# 你可以根据需要选择不同的层
layer1 = model.layer1[0].conv1
layer2 = model.layer2[0].conv1
layer3 = model.layer3[0].conv1# 创建钩子函数,用于提取特征图
features = {}def get_hook(name):def hook(module, input, output):features[name] = output.detach()return hook# 注册钩子
layer1.register_forward_hook(get_hook('layer1'))
layer2.register_forward_hook(get_hook('layer2'))
layer3.register_forward_hook(get_hook('layer3'))# 图像预处理
transform = transforms.Compose([transforms.Resize((224, 224)),transforms.ToTensor(),transforms.Normalize(mean=[0.485, 0.456, 0.406],std =[0.229, 0.224, 0.225])
])# 载入一张示例图片
img_path = '你的图片路径.jpg' # 替换为你的图片路径
from PIL import Image
img = Image.open(img_path).convert('RGB')
input_tensor = transform(img).unsqueeze(0).to(device)# 前向传播,激活钩子函数
with torch.no_grad():output = model(input_tensor)# 定义函数用于可视化特征图
def plot_feature_maps(feature_maps, title):num_feature_maps = feature_maps.shape[1]size = int(np.sqrt(num_feature_maps))plt.figure(figsize=(15, 15))for i in range(min(num_feature_maps, 16)): # 最多显示16个特征图plt.subplot(4, 4, i+1)plt.imshow(feature_maps[0, i].cpu(), cmap='viridis')plt.axis('off')plt.suptitle(title)plt.show()# 可视化不同层的特征图
for layer_name in ['layer1', 'layer2', 'layer3']:fmap = features[layer_name]plot_feature_maps(fmap, f'Feature Maps from {layer_name}')
说明:
- 你可以选择不同的层(
layer1
、layer2
、layer3
)进行钩子注册,提取不同卷积层的特征图。 - 代码中
plot_feature_maps
函数会显示前16个特征图(如果存在)。 - 替换
img_path
为你的测试图片路径。 - 可视化结果会显示不同层的特征图,帮助你直观对比。
相关文章:

Python Day46
Task: 1.不同CNN层的特征图:不同通道的特征图 2.什么是注意力:注意力家族,类似于动物园,都是不同的模块,好不好试了才知道。 3.通道注意力:模型的定义和插入的位置 4.通道注意力后的特征图和热力…...

基于PostGIS的各地级市路网长度统计及Echarts图表可视化实践-以湖南省为例
目录 前言 一、路网长度计算 1、地级市列表查询 2、地级市路网长度查询 二、Echarts可视化实现 1、Echarts后端生成 2、引入Colormap配色 3、前端微调 三、总结 前言 在当今快速发展的社会中,交通路网的建设与布局对于一个地区的经济发展、居民生活以及城市…...

mac版excel如何制作时长版环形图
设置辅助列 创建簇状柱形图 将辅助列绘制在次坐标轴 工作时长在主坐标轴,右键分别更改图表类型为圆环。 辅助列圆环全部为灰色,边框为白色 辅助列设置透明度100% 设置辅助列和工作时长列同样的圆环大小 可得 核心:只要辅助列边框不透明…...
PCB设计教程【大师篇】——STM32开发板原理图设计(电源部分)
前言 本教程基于B站Expert电子实验室的PCB设计教学的整理,为个人学习记录,旨在帮助PCB设计新手入门。所有内容仅作学习交流使用,无任何商业目的。若涉及侵权,请随时联系,将会立即处理 目录 前言 1. 工程创建与前期…...
k8s4部署
configMap configmap概述:数据会存储在etcd数据库,其应用场景主要在应用程序的配置 configmap支持的类型(1)键值对(2)多行数据 pod使用configmap资源有两种常见的方式(1)变量注入&a…...
贝叶斯医学分析中“先验”的如何进行选择(文献解读)
贝叶斯医学分析中“先验”的如何进行选择(文献解读) 作者:Callum Taylor, Kathryn Puxty, Tara Quasim, Martin Shaw 文章标题:Understanding Bayesian analysis of clinical trials: an overview for clinicians 期刊名称&#x…...
【汇编逆向系列】七、函数调用包含多个参数之浮点型- XMM0-3寄存器
目录 1. 汇编代码 1.1 debug编译 1.2 release编译 2. 汇编分析 2.1 浮点参数传递规则 2.2 栈帧rsp的变化时序 2.3 参数的访问逻辑 2.4 返回值XMM0寄存器 3. 汇编转化 3.1 Debug编译 3.2 Release 编译 3.3 C语言转化 1. 汇编代码 上一节介绍了整型的函数传参&#x…...

【MySQL系列】MySQL 执行 SQL 文件
博客目录 一、MySQL 执行 SQL 文件的常见场景二、MySQL 执行 SQL 文件的主要方法1. 使用 MySQL 命令行客户端2. 在 MySQL 交互界面中使用 source 命令3. 使用 MySQL Workbench 等图形化工具4. 使用编程语言接口 三、执行 SQL 文件时的注意事项1. 字符集问题2. 事务处理3. 错误处…...

论文MR-SVD
每个像素 7 个 FLOPs意思: FLOPs(浮点运算次数):衡量算法计算复杂度的指标,数值越小表示运算越高效。含义:对图像中每个像素进行处理时,仅需执行7 次浮点运算(如加减乘除等…...

Java 日期时间类全面解析
Java 日期时间类全面解析:从传统到现代的演进 一、发展历程概览 二、传统日期类(Java 8前) 1. java.util.Date - 日期表示类 Date now new Date(); // 当前日期时间 System.out.println(now); // Wed May 15 09:30:45 CST 2023// 特定时间…...

【工具-Wireshark 抓包工具】
工具-Wireshark 抓包工具 ■ Wireshark 抓包工具■ 通过IP指定查看■■ ■ Wireshark 抓包工具 抓包工具】win 10 / win 11:WireShark 下载、安装、使用 Wireshark下载 阿里云镜像 ■ 通过IP指定查看 ■ ■...
Linux安全机制:从SELinux到Intel SGX的堡垒
Linux安全机制:从SELinux到Intel SGX的堡垒 数字世界的钢铁长城 引言:操作系统的"防御工事" 当服务器每天承受数百万次攻击尝试时,Linux内核的安全机制如同精密的防御系统,在纳秒级时间内做出响应。现代Linux安全架构已…...

设备驱动与文件系统:06 目录与文件
磁盘使用的最后一层抽象:文件系统 今天我们讲第31讲,这一讲将完成磁盘对磁盘使用的最后一层抽象。对此板使用最后一层抽象,抽象出来的是什么呢? 实际上我们使用过磁盘,大家应该有这样的认识,最后不管这个磁…...
C++11 Token Bucket (令牌桶)算法的锁无实现及应用
Token Bucket(令牌桶)算法是一种在流量控制和资源分配领域被广泛应用的技术。它通过约束数据传输速率或任务执行频率,确保系统在资源有限的情况下,能够稳定、高效地运行,避免因突发流量或任务积压而导致的性能下降甚至…...
详细介绍uni-app中Composition API和Options API的使用方法
uni-app 中 Composition API 和 Options API 的使用方法详解 一、Options API(Vue 2.x 传统方式) 1. 基本结构 Options API 通过配置对象的不同选项(如 data、methods、computed 等)组织代码: <template><…...
delphi7 链表 使用方法
在 Delphi 中,链表是一种常见的数据结构,用于存储一系列的元素,其中每个元素都包含一个指向列表中下一个元素的引用。在 Delphi 7 中,你可以手动实现链表,或者使用一些现有的集合类,例如 TList 或者 TLinke…...

Linux 系统中的算法技巧与性能优化
引言 Linux 系统以其开源、稳定和高度可定制的特性,在服务器端、嵌入式设备以及开发环境中得到了极为广泛的应用。对于开发者而言,不仅要掌握在 Linux 环境下实现各类算法的方法,更要知晓如何利用系统特性对算法进行优化,以提升…...

【C++系列】模板类型特例化
1. C模板类型特例化介绍 定义:模板类型特例化(Template Specialization)是C中为模板的特定类型提供定制实现的机制,允许开发者对通用模板无法处理的特殊类型进行优化或特殊处理。 产生标准: C98/03…...

K8S认证|CKS题库+答案| 7. Dockerfile 检测
目录 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、修改 Dockerfile 3)、 修改 deployment.yaml 7. Dockerfile 检测 免费获取并激活 CKA_v1.31_模拟系统 题目 您必须在以…...
JAVA 对象 详解
对象 对象结构: 对象头(元数据和指向class的指针)、实例数据、对齐填充 数组对象: 对象头(元数据和指向class的指针)、数组长度、数组数据、对齐填充 对象创建: 一、当Java虚拟机遇到一条…...
MATLAB实战:四旋翼姿态控制仿真方案
以下是一个基于MATLAB/Simulink的四旋翼姿态控制仿真方案。本方案使用简化姿态动力学模型,并设计PID控制器进行稳定控制。 1. 四旋翼姿态动力学模型 核心方程:I * ω̇ ω (I * ω) τ 其中: I diag([Ixx, Iyy, Izz]) 为转动惯量矩阵 …...

基于Scala实现Flink的三种基本时间窗口操作
目录 代码结构 代码解析 (1) 主程序入口 (2) 窗口联结(Window Join) (3) 间隔联结(Interval Join) (4) 窗口同组联结(CoGroup) (5) 执行任务 代码优化 (1) 时间戳分配 (2) 窗口大小 (3) 输出格式…...

c++对halcon的动态链接库dll封装及调用(细细讲)
七个部分(是个大工程) 一,halcon封装函数导出cpp的内容介绍 二,c++中对halcon环境的配置 三,在配置环境下验证halcon代码 四,dll项目创建+环境配置 五,编辑dll及导出 六,调用打包好的动态链接库的配置 七,进行测试 一,halcon的封装及导出cpp的介绍 1,我这里…...

【优选算法】分治
一:颜色分类 class Solution { public:void sortColors(vector<int>& nums) {// 三指针法int n nums.size();int left -1, right n, i 0;while(i < right){if(nums[i] 0) swap(nums[left], nums[i]);else if(nums[i] 2) swap(nums[--right], num…...
QGraphicsView中鼠标点击与移动事件传递给MainWindow
在Qt图形应用程序开发中,QGraphicsView和QGraphicsScene框架提供了强大的2D图形显示功能。然而,当我们需要在主窗口(MainWindow)中处理这些视图中的鼠标事件。 问题背景 在典型的Qt图形应用程序架构中: MainWindow └── QGraphicsView└── QGraphicsScene└── QGra…...

【图片识别改名】如何批量将图片按图片上文字重命名?自动批量识别图片文字并命名,基于图片文字内容改名,WPF和京东ocr识别的解决方案
应用场景 在日常工作和生活中,我们经常会遇到需要对大量图片进行重命名的情况。例如,设计师可能需要根据图片内容为设计素材命名,文档管理人员可能需要根据扫描文档中的文字对图片进行分类命名。传统的手动重命名方式效率低下且容易出错&…...

RabbitMQ 的高可用性
RabbitMQ 是比较有代表性的,因为是基于主从(非分布式)做高可用的RabbitMQ 有三种模式:单机模式、普通集群模式、镜像集群模式。 单机模式 单机模式,生产几乎不用。 普通集群模式(无高可用性) 普通集群模…...
DAY 48 随机函数与广播机制
知识点回顾: 随机张量的生成:torch.randn函数卷积和池化的计算公式(可以不掌握,会自动计算的)pytorch的广播机制:加法和乘法的广播机制 ps:numpy运算也有类似的广播机制,基本一致 作…...
计算机基础知识(第五篇)
计算机基础知识(第五篇) 架构演化与维护 软件架构的演化和定义 软件架构的演化和维护就是对架构进行修改和完善的过程,目的就是为了使软件能够适应环境的变化而进行的纠错性修改和完善性修改等,是一个不断迭代的过程࿰…...
从零开始制作小程序简单概述
以下是结合案例的“从零制作小红书风格小程序”的全流程指南,采用小红书爆款笔记的结构呈现,并附CSDN参考资源👇: 一、核心开发步骤(附工具推荐) 账号与定位 ✅ 注册类型选择:个人店(…...