CBAM 的整体结构#
在具体展开之前,我们先从宏观看看 CBAM 的架构思路。
CBAM 由两个子模块串联而成:
- 通道注意力模块(Channel Attention Module,CAM)
- 空间注意力模块(Spatial Attention Module,SAM)
(很推荐去看原论文,几张传播图做的非常清晰,一目了然。)
如图,给定特征图 ,CBAM 依次应用两个模块:
- 通道注意力得到 ,与输入逐通道相乘。
- 空间注意力得到 ,与上一步结果逐空间位置相乘。
需要说明的是,这两个模块的顺序并不是随意的。作者在消融实验中测试了三种排列方式:
| 排列方式 | Top-1 准确率 |
|---|---|
| 无注意力(baseline) | 93.04% |
| 空间 → 通道 | 93.50% |
| 通道 → 空间(CBAM) | 93.86% |
结果表明,先通道后空间是最优排列。
直觉上也说得通:先明确"哪个特征重要",再定位"特征位置在哪",逻辑上更加自然。
下面分别展开两个模块的细节。
2. 通道注意力模块 CAM#
CBAM 的通道注意力模块和 SE 模块的思路非常相似,核心差异在于池化方式。
SE 只使用了全局平均池化 GAP来压缩空间信息。
但 CBAM 的作者认为:仅靠平均值会丢失信息的"峰值",而最大池化能够捕捉到特征图中最强烈的响应位置,这对注意力权重的估计是有益的。
因此,CBAM 同时使用了两种池化方式:
- 全局平均池化:反映通道的整体响应强度
- 全局最大池化:反映通道的最强响应值
二者并行,各自得到一个 的通道描述向量:
这两个向量各自输入到一个和 SE 中结构相同的 MLP中,得到:
然后将两个输出逐元素相加,再经过 Sigmoid 得到最终的通道权重:
两者结合,比 SE 单独用 GAP 的鲁棒性更强。
3. 空间注意力模块 SAM#
通道注意力解决了"该关注哪个通道"的问题,但特征图上不同的空间位置对任务的贡献显然也不一样。
于是,CBAM 在对通道注意力进行改进的基础之上,继续提出空间注意力模块。
它的做法是先沿通道维度进行统计聚合,将 个通道压缩为 1 个通道,这里也同时使用了平均池化和最大池化,但操作方式有所不同:
- 沿通道维度做平均池化:生成 的平均特征图。
- 沿通道维度做最大池化:生成 的最大特征图。
将这两张特征图在通道维度上拼接,得到一个 的张量:
然后经过一个 的卷积层,设计padding = 3, stride = 1保证空间尺寸不变,融合两图信息,降维到 ,最后通过 Sigmoid 得到空间权重:
这里选择 卷积而非 ,是因为空间注意力需要较大的感受野来确定哪个区域重要,较小的卷积核可能只能看到局部,难以感知全局的空间分布。
最终得到的 就是空间注意力权重图,每个位置的数值表示该位置的重要性,然后与输入特征图逐元素相乘,实现空间维度上的特征重标定。
在原始特征图上依次应用两个模块得到的权重,就完成了 CBAM 的完整逻辑。
4. CBAM 和 SE#
在 SE 中,我们提到它是一个轻量级模块,我们先来看看 CBAM 会让其“变重多少”:
首先,CBAM 的额外开销主要来自空间注意力中的 卷积,而通道注意力的参数量与 SE 完全相同。
因此,对于一个 通道的特征图,二者参数量对比为(忽略偏置):
- SE:两层 MLP
- CBAM:两层 MLP + 一层 卷积
可以看到,相比于 SE,CBAM 增加的计算量几乎可以忽略不计。
因此,虽然 CBAM 已经是八年前的工作,但其同样简单高效、即插即用的特性,让其在许多轻量级网络(如 MobileNetV3)中仍然被广泛采用。
作者:哥布林学者
出处:深度学习进阶(十六) 混合注意力 CBAM - 哥布林学者 - 博客园
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
给自己一些时间。
合集: 深度学习进阶
分类: 深度学习进阶
