源码、配套笔记&讲解视频,点击文末名片获取
- 研究背景和动机
(1)CNN 的进步与瓶颈
在 ResNet、Inception、MobileNet 等卷积神经网络出现后,模型的深度和结构设计越来越强大,分类和检测精度不断提升。
👉 但是,传统卷积操作主要关注 空间维度(比如卷积核在图像上滑动,提取边缘、纹理等特征),而对 通道维度(每个 feature map 的“重要性”)的建模非常有限。
换句话说,模型能学到“哪里有东西”,但不太会判断“哪些通道更关键”。
(2)通道信息的重要性
举个直观的例子:
- 在彩色图像中,红、绿、蓝三个通道分别代表不同颜色信息,但并不是每个任务都同等重要。
- 比如识别人脸时,可能“红色通道(肤色信息)”更重要;
- 而识别森林图像时,“绿色通道”贡献更大。
然而,以往 CNN 的卷积核在处理时,把所有通道几乎一视同仁,缺乏一种机制去“挑重点”。
(3)SENet 的动机
SENet 的作者提出:
👉 是否可以让网络自己学会“给通道分配权重”,自动强调有用的通道,抑制无关的通道?
这就像:
- 在工厂生产线上,每个工人(通道)都在干活,但有些工人做的零件特别关键。
- 如果工厂经理(SENet)能识别出关键工人,并给他们更多资源和关注,那么整个工厂的产能和产品质量就会提升。
✅ 因此,SENet 的核心出发点是:
通过“挤压与激励”机制(Squeeze & Excitation),显式建模通道之间的关系,让 CNN 学会通道注意力,从而提升特征表达能力。
- SENet 的创新点
(1)提出了通道注意力机制(Channel Attention)
- 传统 CNN 更关注“空间特征”(卷积核在图像上滑动提取边缘、纹理),但忽略了 通道之间的重要性差异。
- SENet 首次显式建模 通道之间的依赖关系,让网络能够自动学习“哪些通道更重要”。
👉 类比:
好比一个交响乐团,虽然有很多乐器(通道),但在不同的乐章里,有的乐器需要突出(小提琴),有的需要弱化(打击乐)。SENet 就像一个指挥家,动态调整音量,让乐团整体表现更完美。
(2)Squeeze(挤压):全局信息压缩
- 对每个通道做 全局平均池化,把空间信息“压缩”成一个全局描述。
- 相当于总结这个通道整体“有没有用”,而不是只看某个小区域。
👉 类比:
就像工厂老板巡视生产线时,不是看每个工人每分钟做什么,而是看整体产出情况,做一个总评分。
(3)Excitation(激励):学习通道权重
- 通过一个小的全连接网络(两个 FC 层 + 激活函数),学到每个通道的“权重”。
- 这个权重就像一个“开关”,决定哪些通道要加强,哪些要弱化。
👉 类比:
好比老板发现有些工人做的零件特别关键,于是给他们更多奖金(提升权重);而那些贡献小的工人,就减少他们的工作强度(降低权重)。
(4)Recalibration(特征重标定)
- 把学到的通道权重重新乘回原特征图,完成“特征重标定”。
- 最终模型得到的是 “重点突出、无关压缩” 的新特征图。
👉 类比:
就像工厂在老板分配资源后,产线重新调整,重要零件被高质量生产,次要零件减少浪费。最终产品更优。
- 轻量:SE 模块只需要极少的额外参数和计算量。
- 通用:可以插入到任意 CNN 结构中(ResNet、Inception、MobileNet、ShuffleNet…)。
- 效果显著:在 ImageNet 上,SENet 拿下 2017 年冠军(Top-5 error 仅 2.25%)。
3、SENet 的网络结构
图2:SE-Inception
左图:原版 Inception 模块
- 上方 X → Inception → X̂:输入进 Inception,多分支卷积后合并,得到输出。没有“权重调节”的步骤。
你可以把 Inception 理解为“并排的多个工位(3×3、5×5、1×1、池化分支等)一起干活,最后把产物拼在一起”。
右图:SE-Inception 模块(关键是 Inception 后接一个 SE)
- Inception(W×H×C)
- 仍然是多分支 → 合并;得到一张 W×H×C 的特征图。
- 这一步跟原版完全一样。
- Global pooling(全局平均池化) → 1×1×C
- 把每个通道在整张图上的“总体表现”压成一个数;得到 C 个分数的草稿。
- 作用:从“全局角度”看每条生产线到底有多重要。
- FC(全连接,降一小步) → 1×1×(C/r)
- 进入第一间“小会议室”:先把信息挤一挤(常用 r=16),成本更低,还能学到非线性组合。
- ReLU
- 给“分数草稿”一次非线性变换,相当于“进一步筛选要点”。(依然在小会议室里)
- FC(全连接,拉回原通道数) → 1×1×C
- 第二间“小会议室”:把分数还原到 C 个通道,每个通道都有自己的评分。
- Sigmoid(把评分压到 0~1)
- 让每条生产线的“音量旋钮”落在 0~1 之间,便于当作权重使用。
- Scale(按通道缩放) → W×H×C
- 把这 C 个权重逐通道乘回到 Inception 的输出上:有用的放大,不重要的压低。尺寸还是 W×H×C,只是“每条线的音量”被调过了。
为什么放在 Inception 的“合并之后”? - Inception 的强项是“多分支/多尺度”。等分支合并后再统一打权,等于对所有尺度做一次总评,更符合模块级语义。
开销如何? - 只多了两层很小的全连接和一次通道乘法;额外算力极小,却能带来可观提升。
图3:SE-ResNet
左图:原版 ResNet 模块
- 结构:捷径(恒等/投影) 直接绕过;卷积分支(1×1→3×3→1×1)产生“新信息”。
- 两路在底部的 ⊕ 处相加。这就是经典的残差。
右图:SE-ResNet 模块(把 SE 放在“相加前”的卷积分支末尾)
- Residual(卷积分支输出,W×H×C)
- 先按原来的 1×1→3×3→1×1 计算,得到“新信息”。
- Global pooling(看全局) → 1×1×C
- 为卷积分支的每个通道做一份全局成绩单。
- FC(降) → ReLU → FC(升) → Sigmoid
- 两间“小会议室”里商量出每个通道的权重(0~1)。
- 和图2完全同款流程,只是作用对象不同:这里只处理“卷积分支”的输出。
- Scale(按通道缩放) → W×H×C
- 给“新信息”调音量。此时捷径分支还没动。
- Add(与捷径相加) → 输出
- 现在再和捷径合并。
- 这么做的好处:你只是在新加的信息上做取舍,不破坏捷径这条稳定的“直达通路”,训练更稳、更有效。论文的消融研究也证实“相加前”最好。
开销与收益 - 以 ResNet-50 为例:3.86 → 3.87 GFLOPs(仅 +0.26%),但精度接近更深的 ResNet-101;CPU 上推理也只多了几毫秒。
4、SENet 的致命缺陷
🔴 SENet 的最大问题:只关注通道关系,忽略空间信息
- SENet 的 SE 模块做的事情,本质上是:
- 把整张特征图“压缩”为一个全局平均值(每个通道一个数)。
- 通过全连接层学出通道权重,决定“哪个通道重要”。
- 用这些权重重新缩放通道。
- 问题在于:
这样做完全 丢弃了空间位置的信息 —— 每个通道里,左上角的像素和右下角的像素,在 SE 眼里是“完全一样”的。
📌 举个形象化的例子
想象你有一群工人(通道),SENet 就像一个经理:
- 它只统计“每个工人平均干了多少活”。
- 决定奖励谁、冷落谁。
- 但它根本不看工人在哪条流水线上干活、具体负责哪个零件。
结果就是: - 虽然知道哪些工人更重要,但完全没法细致地调度“哪个岗位更需要加强”。
- 如果一个工人只在局部区域特别重要(比如图像的一个小角落),SENet 就“看不到”了。
📊 后续研究怎么解决?
很多改进版注意力机制正是为了填补这个缺陷:
- CBAM (Convolutional Block Attention Module, 2018):在 SE 的通道注意力之外,再加一个空间注意力,让网络知道“图像的哪个位置更重要”。
- ECA-Net (2020):简化通道建模,用卷积取代全连接,减少参数和过拟合风险。
- Coordinate Attention (2021):同时建模通道和坐标方向,让网络既看重“谁重要”,又看重“在哪个位置重要”。