共计 2246 个字符,预计需要花费 6 分钟才能阅读完成。
1. 背景
1.1 现有问题
传统 CNN 在复杂场景下存在特征提取效率低下的问题,尤其是在处理多尺度目标和复杂背景时,模型往往难以有效聚焦关键区域。这主要是因为传统卷积操作对所有通道和空间位置平等对待,缺乏对重要特征的针对性增强。

2. 方法
2.1 CBAM 核心原理
CBAM(Convolutional Block Attention Module)通过通道和空间双重注意力机制,显著提升模型性能。其核心思想是让网络学会 ” 看哪里 ” 和 ” 看什么 ”。
2.1.1 通道注意力
通道注意力权重计算公式:
M_c(F) = \sigma(MLP(AvgPool(F)) + MLP(MaxPool(F)))
其中:
– $F$ 是输入特征图
– $\sigma$ 是 sigmoid 激活函数
– MLP 是多层感知机,包含一个降维层和一个升维层
2.1.2 空间注意力
空间注意力权重计算公式:
M_s(F) = \sigma(f^{7×7}([AvgPool(F); MaxPool(F)]))
其中:
– $f^{7×7}$ 是 7×7 卷积
– [;]表示通道拼接
2.2 与 SE-Net 对比
| 指标 | SE-Net | CBAM |
|---|---|---|
| 参数量 | 1.25× | 1.28× |
| 计算量(FLOPs) | +2% | +5% |
| Top- 1 准确率 | +1.5% | +2.1% |
3. PyTorch 实现
import torch
import torch.nn as nn
import torch.nn.functional as F
class ChannelAttention(nn.Module):
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
# 输入维度: [B, C, H, W]
self.avg_pool = nn.AdaptiveAvgPool2d(1) # 输出[B, C, 1, 1]
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False)
self.relu = nn.ReLU()
self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False)
def forward(self, x):
avg_out = self.fc2(self.relu(self.fc1(self.avg_pool(x))))
max_out = self.fc2(self.relu(self.fc1(self.max_pool(x))))
out = avg_out + max_out
return torch.sigmoid(out)
class SpatialAttention(nn.Module):
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
# 输入维度: [B, C, H, W]
self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, bias=False)
def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True) # [B, 1, H, W]
max_out, _ = torch.max(x, dim=1, keepdim=True)
concat = torch.cat([avg_out, max_out], dim=1) # [B, 2, H, W]
out = self.conv(concat)
return torch.sigmoid(out)
class CBAM(nn.Module):
def __init__(self, in_planes):
super(CBAM, self).__init__()
self.ca = ChannelAttention(in_planes)
self.sa = SpatialAttention()
def forward(self, x):
x = x * self.ca(x) # 通道注意力
x = x * self.sa(x) # 空间注意力
return x
4. 工程实践
4.1 常见问题解决方案
- 多 GPU 训练同步问题
- 使用
torch.nn.parallel.DistributedDataParallel替代DataParallel -
确保注意力权重在 GPU 间正确同步
-
量化部署精度损失
- 对注意力模块采用混合精度量化
-
使用 QAT(量化感知训练)微调
-
输入尺寸变化处理
- 将固定尺寸的池化改为自适应池化
- 使用动态卷积核调整空间注意力
5. 实验数据
5.1 CIFAR-100 结果
| 模型 | FLOPs | mAP |
|---|---|---|
| ResNet-34 | 3.6G | 72.3% |
| +SE | 3.7G | 74.1% |
| +CBAM | 3.8G | 75.6% |
5.2 耗时分析(TorchProfiler)
- 通道注意力: 占总计算时间 8.2%
- 空间注意力: 占总计算时间 11.7%
- 其余部分: 80.1%
6. 延伸思考
- CBAM 与 Transformer 的 MHSA 结合可能性
- 可以尝试用 CBAM 替代 Transformer 中的部分注意力头
-
需要解决计算复杂度的线性增长问题
-
边缘设备优化方案
- 采用深度可分离卷积重构空间注意力
- 量化通道注意力的 MLP 部分
- 使用神经架构搜索自动设计轻量模块
7. 总结
CBAM 通过简单而有效的双重注意力机制,在不显著增加计算成本的情况下提升了模型性能。在实际部署中,需要根据具体场景平衡精度和效率的关系。未来可以探索更多注意力机制的变体和组合方式,特别是在边缘计算场景下的优化方案。
正文完
