CBAM注意力模块结构图
时间: 2025-05-25 21:21:33 浏览: 37
CBAM(Convolutional Block Attention Module)是一种经典的注意力机制,其主要由通道注意力(Channel Attention)和空间注意力(Spatial Attention)两个子模块组成。这两个子模块通过串联的方式依次作用于输入特征图。
### CBAM注意力机制架构概述
CBAM的核心思想在于通过对通道维度和空间维度分别施加注意力权重,从而增强模型对重要区域的关注能力。具体来说:
- **通道注意力子模块**
首先通过全局平均池化(Global Average Pooling, GAP)和全局最大池化(Global Max Pooling, GMP),提取每个通道上的统计信息[^1]。接着,这些统计信息会被送入一个多层感知机(MLP)网络中进行处理,通常会有一个降维操作(例如将通道数压缩到原来的 \( \frac{1}{r} \),其中 \( r \) 是缩减比)。最终,经过激活函数(ReLU 和 Sigmoid)后生成通道级别的注意权值[^2]。
- **空间注意力子模块**
空间注意力则关注的是像素级的空间分布关系。该部分通过沿通道轴计算均值和最大值来获取二维的特征表示[^1]。随后,这些特征被拼接在一起并通过一个卷积层融合成单一的空间注意图。为了进一步提升性能,在某些变体中可能会调整卷积核大小(如3×3或7×7),并加入批量归一化(Batch Normalization)以稳定训练过程[^2]。
以下是基于PyTorch实现的一个简化版CBAM代码示例:
```python
import torch
import torch.nn as nn
class ChannelAttention(nn.Module):
def __init__(self, in_planes, ratio=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.shared_mlp = nn.Sequential(
nn.Conv2d(in_planes, in_planes // ratio, kernel_size=1),
nn.ReLU(),
nn.Conv2d(in_planes // ratio, in_planes, kernel_size=1)
)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.shared_mlp(self.avg_pool(x))
max_out = self.shared_mlp(self.max_pool(x))
out = self.sigmoid(avg_out + max_out)
return out
class SpatialAttention(nn.Module):
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
assert kernel_size in (3, 7), 'kernel size must be 3 or 7'
padding = 3 if kernel_size == 7 else 1
self.conv = nn.Conv2d(2, 1, kernel_size, padding=padding, bias=False)
self.bn = nn.BatchNorm2d(1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
out = torch.cat([avg_out, max_out], dim=1)
out = self.conv(out)
out = self.bn(out)
return self.sigmoid(out)
class CBAM(nn.Module):
def __init__(self, in_planes, reduction_ratio=16, kernel_size=7):
super(CBAM, self).__init__()
self.channel_attention = ChannelAttention(in_planes, reduction_ratio)
self.spatial_attention = SpatialAttention(kernel_size)
def forward(self, x):
out = self.channel_attention(x) * x
out = self.spatial_attention(out) * out
return out
```
以上代码定义了一个完整的CBAM模块,其中包括`ChannelAttention`和`SpatialAttention`两个核心组件,并将其组合起来形成最终的CBAM结构。
### 结构图描述
虽然无法直接提供图像文件,但可以文字形式描绘CBAM的整体流程:
1. 输入张量进入CBAM;
2. 经过通道注意力模块处理,输出带有通道权重的新张量;
3. 将此新张量乘回原始输入作为下一步输入;
4. 接着传入空间注意力模块,再次获得带空间权重的结果;
5. 输出最终经双重注意力调节后的特征图。
如果需要更直观的理解,建议查阅相关论文附录或者开源项目文档中的插图说明。
阅读全文
相关推荐


















