上一篇我们介绍了 SE 模块,从通道维度引入了注意力机制,让网络能够自适应地调整每个通道的权重。
再结合之前的相关内容,现在我们已经对通道维度和空间维度上的注意力逻辑都有所了解了,显然二者并不冲突,反而是相辅相成的,因此一个想法自然就出现了:
组合应用通道注意力和空间注意力,实现混合注意力机制。
沿着这个思路,18 年的论文:CBAM: Convolutional Block Attention Module 提出在 SE 的通道注意力基础上,进一步引入空间注意力模块,形成了"通道 + 空间"的混合注意力机制。
由于同时关注了"是什么"和"在哪里",CBAM 在图像分类、目标检测等任务上均取得了比 SE 更优的收益。
1. CBAM 的整体结构
在具体展开之前,我们先从宏观看看 CBAM 的架构思路。
CBAM 由两个子模块串联而成:
- 通道注意力模块(Channel Attention Module,CAM)
- 空间注意力模块(Spatial Attention Module,SAM)

(很推荐去看原论文,几张传播图做的非常清晰,一目了然。)
如图,给定特征图 \(\mathbf{F} \in \mathbb{R}^{C \times H \times W}\),CBAM 依次应用两个模块:
- 通道注意力得到 \(\mathbf{M}_c \in \mathbb{R}^{C \times 1 \times 1}\),与输入逐通道相乘。
- 空间注意力得到 \(\mathbf{M}_s \in \mathbb{R}^{1 \times H \times W}\),与上一步结果逐空间位置相乘。
需要说明的是,这两个模块的顺序并不是随意的。作者在消融实验中测试了三种排列方式:
| 排列方式 | Top-1 准确率 |
|---|---|
| 无注意力(baseline) | 93.04% |
| 空间 → 通道 | 93.50% |
| 通道 → 空间(CBAM) | 93.86% |
结果表明,先通道后空间是最优排列 。
直觉上也说得通:先明确"哪个特征重要",再定位"特征位置在哪",逻辑上更加自然。
下面分别展开两个模块的细节。
2. 通道注意力模块 CAM
CBAM 的通道注意力模块和 SE 模块的思路非常相似,核心差异在于池化方式 。
SE 只使用了 全局平均池化 GAP 来压缩空间信息。
但 CBAM 的作者认为:仅靠平均值会丢失信息的"峰值",而最大池化能够捕捉到特征图中最强烈的响应位置,这对注意力权重的估计是有益的。
因此,CBAM 同时使用了两种池化方式:
- 全局平均池化:反映通道的整体响应强度
- 全局最大池化:反映通道的最强响应值
二者并行,各自得到一个 \(1 \times 1 \times C\) 的通道描述向量:
\[\mathbf{z}{\text{avg}} = \text{GAP}(\mathbf{F}), \quad \mathbf{z}{\text{max}} = \text{GMP}(\mathbf{F}) \]
这两个向量各自输入到一个和 SE 中结构相同的 MLP 中,得到:
\[\mathbf{s}{\text{avg}} = \text{MLP}(\mathbf{z}{\text{avg}}), \quad \mathbf{s}{\text{max}} = \text{MLP}(\mathbf{z}{\text{max}}) \]
然后将两个输出逐元素相加,再经过 Sigmoid 得到最终的通道权重:
\[\mathbf{M}_c(\mathbf{F}) = \sigma\Big(\text{MLP}(\text{GAP}(\mathbf{F})) + \text{MLP}(\text{GMP}(\mathbf{F}))\Big) \]

两者结合,比 SE 单独用 GAP 的鲁棒性更强。
3. 空间注意力模块 SAM
通道注意力解决了"该关注哪个通道"的问题,但特征图上不同的空间位置对任务的贡献显然也不一样。
于是,CBAM 在对通道注意力进行改进的基础之上,继续提出空间注意力模块。
它的做法是先沿通道维度进行统计聚合 ,将 \(C\) 个通道压缩为 1 个通道,这里也同时使用了平均池化和最大池化,但操作方式有所不同:
- 沿通道维度做平均池化 :生成 \(1 \times H \times W\) 的平均特征图。
- 沿通道维度做最大池化 :生成 \(1 \times H \times W\) 的最大特征图。
将这两张特征图在通道维度上拼接,得到一个 \(2 \times H \times W\) 的张量:
\[\mathbf{F}_{\text{concat}} = \text{Concat}\big(\text{AvgPool}(\mathbf{F}); \text{MaxPool}(\mathbf{F})\big) \]
然后经过一个 \(7 \times 7\) 的卷积层,设计 padding = 3, stride = 1 保证空间尺寸不变,融合两图信息,降维到 \(1 \times H \times W\),最后通过 Sigmoid 得到空间权重:
\[\mathbf{M}_s(\mathbf{F}) = \sigma\big(f^{7 \times 7}([\text{AvgPool}(\mathbf{F}); \text{MaxPool}(\mathbf{F})])\big) \]

这里选择 \(7 \times 7\) 卷积而非 \(3 \times 3\),是因为空间注意力需要较大的感受野来确定哪个区域重要,较小的卷积核可能只能看到局部,难以感知全局的空间分布。
最终得到的 \(\mathbf{M}_s \in \mathbb{R}^{1 \times H \times W}\) 就是空间注意力权重图,每个位置的数值表示该位置的重要性,然后与输入特征图逐元素相乘,实现空间维度上的特征重标定。
在原始特征图上依次应用两个模块得到的权重,就完成了 CBAM 的完整逻辑。
4. CBAM 和 SE
在 SE 中,我们提到它是一个轻量级模块 ,我们先来看看 CBAM 会让其"变重多少":
首先,CBAM 的额外开销主要来自空间注意力中的 \(7 \times 7\) 卷积,而通道注意力的参数量与 SE 完全相同。
因此,对于一个 \(C\) 通道的特征图,二者参数量对比为(忽略偏置):
- SE:两层 MLP
\[2C^2 / r \]
- CBAM:两层 MLP + 一层 \(7 \times 7\) 卷积
\[2C^2 / r + 2 \times 7 \times 7 \times 1 \approx 2C^2 / r + 98 \]
可以看到,相比于 SE,CBAM 增加的计算量几乎可以忽略不计。
因此,虽然 CBAM 已经是八年前的工作,但其同样简单高效、即插即用的特性,让其在许多轻量级网络(如 MobileNetV3)中仍然被广泛采用。