news 2026/5/10 6:51:54

DAY 47 通道注意力(SE注意力)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
DAY 47 通道注意力(SE注意力)

一、注意力

注意力机制是一种让模型学会「选择性关注重要信息」的特征提取器,就像人类视觉会自动忽略背景,聚焦于图片中的主体(如猫、汽车)。

transformer中的叫做自注意力机制,他是一种自己学习自己的机制,他可以自动学习到图片中的主体,并忽略背景。我们现在说的很多模块,比如通道注意力、空间注意力、通道注意力等等,都是基于自注意力机制的。

从数学角度看,注意力机制是对输入特征进行加权求和,输出=∑(输入特征×注意力权重),其中注意力权重是学习到的。所以他和卷积很像,因为卷积也是一种加权求和。但是卷积是 “固定权重” 的特征提取(如 3x3 卷积核)--训练完了就结束了,注意力是 “动态权重” 的特征提取(权重随输入数据变化)---输入数据不同权重不同。

问:为什么需要多种注意力模块?

答:因为不同场景下的关键信息分布不同。例如,识别鸟类和飞机时,需关注 “羽毛纹理”“金属光泽” 等特定通道的特征,通道注意力可强化关键通道;而物体位置不确定时(如猫出现在图像不同位置),空间注意力能聚焦物体所在区域,忽略背景。复杂场景中,可能需要同时关注通道和空间(如混合注意力模块 CBAM),或处理长距离依赖(如全局注意力模块 Non-local)。

问:为什么不设计一个‘万能’注意力模块?

答:主要受效率和灵活性限制。专用模块针对特定需求优化计算,成本更低(如通道注意力仅需处理通道维度,无需全局位置计算);不同任务的核心需求差异大(如医学图像侧重空间定位,自然语言处理侧重语义长距离依赖),通用模块可能冗余或低效。每个模块新增的权重会增加模型参数量,若训练数据不足或优化不当,可能引发过拟合。因此实际应用中需结合轻量化设计(如减少全连接层参数)、正则化(如 Dropout)或结构约束(如共享注意力权重)来平衡性能与复杂度。

通道注意力(Channel Attention)属于注意力机制(Attention Mechanism)的变体,而非自注意力(Self-Attention)的直接变体。可以理解为注意力是一个动物园算法,里面很多个物种,自注意力只是一个分支,因为开创了transformer所以备受瞩目。

常见注意力模块的归类如下:

注意力模块

所属类别

核心功能

自注意力(Self-Attention)

自注意力变体

建模同一输入内部元素的依赖(如序列位置、图像块)

通道注意力(Channel Attention)

普通注意力变体(全局上下文)

建模特征图通道间的重要性,通过全局池化压缩空间信息

空间注意力(Spatial Attention)

普通注意力变体(全局上下文)

建模特征图空间位置的重要性,关注“哪里”更重要

多头注意力(Multi-Head Attention)

自注意力/普通注意力的增强版

将query/key/value投影到多个子空间,捕捉多维度依赖

编码器-解码器注意力(Encoder-Decoder Attention)

普通注意力变体

建模编码器输出与解码器输入的跨模态交互(如机器翻译中句子与译文的对齐)

二、通道注意力

想要把通道注意力插入到模型中,关键步骤如下:

(1)定义注意力模块

(2)重写之前的模型定义部分,确定好模块插入的位置

1.通道注意力的定义

# ===================== 新增:通道注意力模块(SE模块) ===================== class ChannelAttention(nn.Module): """通道注意力模块(Squeeze-and-Excitation)""" def __init__(self, in_channels, reduction_ratio=16): """ 参数: in_channels: 输入特征图的通道数 reduction_ratio: 降维比例,用于减少参数量 """ super(ChannelAttention, self).__init__() # 全局平均池化 - 将空间维度压缩为1x1,保留通道信息 self.avg_pool = nn.AdaptiveAvgPool2d(1) # 全连接层 + 激活函数,用于学习通道间的依赖关系 self.fc = nn.Sequential( # 降维:压缩通道数,减少计算量 nn.Linear(in_channels, in_channels // reduction_ratio, bias=False), nn.ReLU(inplace=True), # 升维:恢复原始通道数 nn.Linear(in_channels // reduction_ratio, in_channels, bias=False), # Sigmoid将输出值归一化到[0,1],表示通道重要性权重 nn.Sigmoid() ) def forward(self, x): """ 参数: x: 输入特征图,形状为 [batch_size, channels, height, width] 返回: 加权后的特征图,形状不变 """ batch_size, channels, height, width = x.size() # 1. 全局平均池化:[batch_size, channels, height, width] → [batch_size, channels, 1, 1] avg_pool_output = self.avg_pool(x) # 2. 展平为一维向量:[batch_size, channels, 1, 1] → [batch_size, channels] avg_pool_output = avg_pool_output.view(batch_size, channels) # 3. 通过全连接层学习通道权重:[batch_size, channels] → [batch_size, channels] channel_weights = self.fc(avg_pool_output) # 4. 重塑为二维张量:[batch_size, channels] → [batch_size, channels, 1, 1] channel_weights = channel_weights.view(batch_size, channels, 1, 1) # 5. 将权重应用到原始特征图上(逐通道相乘) return x * channel_weights # 输出形状:[batch_size, channels, height, width]

通道注意力模块的核心原理

(1)Squeeze(压缩):

- 通过全局平均池化将每个通道的二维特征图(H×W)压缩为一个标量,保留通道的全局信息。

- 物理意义:计算每个通道在整个图像中的 “平均响应强度”,例如,“边缘检测通道” 在有物体边缘的图像中响应值会更高。

(2)Excitation(激发):

- 通过全连接层+Sigmoid激活,学习通道间的依赖关系,输出0-1之间的权重值。

- 物理意义:让模型自动判断哪些通道更重要(权重接近 1),哪些通道可忽略(权重接近 0)。

(3)Reweight(重加权):

- 将学习到的通道权重与原始特征图逐通道相乘,增强重要通道,抑制不重要通道。

- 物理意义:类似人类视觉系统聚焦于关键特征(如猫的轮廓),忽略无关特征(如背景颜色)

通道注意力插入后,参数量略微提高,增加了特征提取能力

2.模型的重新定义(通道注意力的插入)

class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() # ---------------------- 第一个卷积块 ---------------------- self.conv1 = nn.Conv2d(3, 32, 3, padding=1) self.bn1 = nn.BatchNorm2d(32) self.relu1 = nn.ReLU() # 新增:插入通道注意力模块(SE模块) self.ca1 = ChannelAttention(in_channels=32, reduction_ratio=16) self.pool1 = nn.MaxPool2d(2, 2) # ---------------------- 第二个卷积块 ---------------------- self.conv2 = nn.Conv2d(32, 64, 3, padding=1) self.bn2 = nn.BatchNorm2d(64) self.relu2 = nn.ReLU() # 新增:插入通道注意力模块(SE模块) self.ca2 = ChannelAttention(in_channels=64, reduction_ratio=16) self.pool2 = nn.MaxPool2d(2) # ---------------------- 第三个卷积块 ---------------------- self.conv3 = nn.Conv2d(64, 128, 3, padding=1) self.bn3 = nn.BatchNorm2d(128) self.relu3 = nn.ReLU() # 新增:插入通道注意力模块(SE模块) self.ca3 = ChannelAttention(in_channels=128, reduction_ratio=16) self.pool3 = nn.MaxPool2d(2) # ---------------------- 全连接层(分类器) ---------------------- self.fc1 = nn.Linear(128 * 4 * 4, 512) self.dropout = nn.Dropout(p=0.5) self.fc2 = nn.Linear(512, 10) def forward(self, x): # ---------- 卷积块1处理 ---------- x = self.conv1(x) x = self.bn1(x) x = self.relu1(x) x = self.ca1(x) # 应用通道注意力 x = self.pool1(x) # ---------- 卷积块2处理 ---------- x = self.conv2(x) x = self.bn2(x) x = self.relu2(x) x = self.ca2(x) # 应用通道注意力 x = self.pool2(x) # ---------- 卷积块3处理 ---------- x = self.conv3(x) x = self.bn3(x) x = self.relu3(x) x = self.ca3(x) # 应用通道注意力 x = self.pool3(x) # ---------- 展平与全连接层 ---------- x = x.view(-1, 128 * 4 * 4) x = self.fc1(x) x = self.relu3(x) x = self.dropout(x) x = self.fc2(x) return x # 重新初始化模型,包含通道注意力模块 model = CNN() model = model.to(device) # 将模型移至GPU(如果可用) criterion = nn.CrossEntropyLoss() # 交叉熵损失函数 optimizer = optim.Adam(model.parameters(), lr=0.001) # Adam优化器 # 引入学习率调度器,在训练过程中动态调整学习率--训练初期使用较大的 LR 快速降低损失,训练后期使用较小的 LR 更精细地逼近全局最优解。 # 在每个 epoch 结束后,需要手动调用调度器来更新学习率,可以在训练过程中调用 scheduler.step() scheduler = optim.lr_scheduler.ReduceLROnPlateau( optimizer, # 指定要控制的优化器(这里是Adam) mode='min', # 监测的指标是"最小化"(如损失函数) patience=3, # 如果连续3个epoch指标没有改善,才降低LR factor=0.5 # 降低LR的比例(新LR = 旧LR × 0.5) ) # 训练模型(复用原有的train函数) print("开始训练带通道注意力的CNN模型...") final_accuracy = train(model, train_loader, test_loader, criterion, optimizer, scheduler, device, epochs=50) print(f"训练完成!最终测试准确率: {final_accuracy:.2f}%")

@浙大疏锦行

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 11:38:44

【Matlab】北航卡尔曼滤波与组合导航 第三次作业 SINS/GPS组合动态实验

北航卡尔曼滤波与组合导航 第三次作业 SINS/GPS组合动态实验本次作业要求进行SINS/GPS组合导航的动态实验,主要涉及卡尔曼滤波和组合导航的相关内容。在Matlab中,你可以使用以下基本步骤来完成这项实验:获取实验数据:首先&#xf…

作者头像 李华
网站建设 2026/5/1 10:46:16

灰度发布策略:安全上线新版TensorFlow模型

灰度发布策略:安全上线新版TensorFlow模型 在一家金融科技公司,数据科学团队刚刚完成了一个新版信用评分模型的训练。相比旧版本,它在离线测试集上的AUC提升了3.2%,团队信心满满地准备上线。但就在全量部署后的两小时内&#xff0…

作者头像 李华
网站建设 2026/5/4 0:07:34

请求签名验证:防止未授权访问你的TensorFlow服务

请求签名验证:防止未授权访问你的TensorFlow服务 在AI模型逐渐成为企业核心资产的今天,将训练好的TensorFlow模型部署为在线推理服务已成常态。无论是金融风控、医疗影像识别,还是智能制造中的异常检测,这些模型往往通过HTTP或gRP…

作者头像 李华
网站建设 2026/4/29 12:33:51

手把手教你启动Open-AutoGLM,从部署到运行的完整流程,新手必看

第一章:Open-AutoGLM部署完成后启动概述Open-AutoGLM在完成部署后,进入系统启动阶段。该阶段的核心目标是验证服务组件的可用性、加载预训练模型权重,并初始化API接口以支持后续的推理请求。启动过程依赖于配置文件与运行时环境变量的正确设置…

作者头像 李华
网站建设 2026/5/3 14:02:30

图解说明ESP32在家庭场景下的音频处理流程

ESP32如何“听懂”家里的声音?——从麦克风到AI识别的完整链路解析 你有没有想过,一个售价不到30元的开发板,是如何在你熟睡时默默监听婴儿啼哭、在玻璃破碎瞬间触发警报,甚至分辨出洗衣机是否运转异常的? 这一切的背…

作者头像 李华
网站建设 2026/5/3 8:18:02

SeedVR2视频修复完整指南:告别Sora2模糊画质的终极方案

SeedVR2视频修复完整指南:告别Sora2模糊画质的终极方案 【免费下载链接】SeedVR2-7B 项目地址: https://ai.gitcode.com/hf_mirrors/ByteDance-Seed/SeedVR2-7B 你是否曾经为Sora2生成的视频在大屏幕上显得模糊不清而苦恼?现在,字节跳…

作者头像 李华