上海百度整站优化服务,微网站制作电话,seo视频,专门做市场调查的网站Day 49 训练 CBAM注意力模块详解与实践#xff1a;给CNN装上智能眼镜一、CBAM是什么#xff1f;二、CBAM的组成模块1. 通道注意力模块#xff08;Channel Attention Module#xff09;2. 空间注意力模块#xff08;Spatial Attention Module#xff09; 三、… Day 49 训练 CBAM注意力模块详解与实践给CNN装上智能眼镜一、CBAM是什么二、CBAM的组成模块1. 通道注意力模块Channel Attention Module2. 空间注意力模块Spatial Attention Module 三、CBAM的优势四、CBAM的实际应用 CBAM注意力模块详解与实践给CNN装上智能眼镜
在深度学习的视觉任务中如何让模型更精准地关注图像中的关键部分一直是研究热点。今天我们就来深入探索CBAMConvolutional Block Attention Module注意力模块它就像给卷积神经网络CNN装上了智能眼镜能让模型同时学会关注什么和关注哪里。
一、CBAM是什么
CBAM是一种即插即用的注意力模块可以无缝集成到任何CNN架构中。它的核心目标是通过学习的方式自动获取特征图在通道和空间维度上的重要性进而对特征图进行自适应调整——增强重要特征抑制不重要特征从而提升模型的特征表达能力和性能。
与之前介绍的SE通道注意力相比CBAM的突破在于
SE仅关注哪些通道重要CBAM不仅关注通道重要性还定位关键特征在图像中的具体位置
这种双重注意力机制让模型能同时回答两个关键问题我应该关注图像中的哪些特征通道注意力“和我在图像的哪个位置找到这些关键特征空间注意力”。
二、CBAM的组成模块
CBAM由两个主要部分组成二者顺序连接共同作用于输入特征图
1. 通道注意力模块Channel Attention Module
通道注意力模块的作用是分析哪些通道的特征更关键。以图像中的颜色、纹理通道为例不同通道可能包含不同的重要信息。
实现原理
使用全局平均池化和全局最大池化将每个通道的特征图压缩为1×1保留通道间的统计信息通过共享的全连接层学习通道间的关系使用Sigmoid函数将输出映射到0-1之间作为各通道的权重
class ChannelAttention(nn.Module):def __init__(self, in_channels, ratio16):super().__init__()self.avg_pool nn.AdaptiveAvgPool2d(1)self.max_pool nn.AdaptiveMaxPool2d(1)self.fc nn.Sequential(nn.Linear(in_channels, in_channels // ratio, biasFalse),nn.ReLU(),nn.Linear(in_channels // ratio, in_channels, biasFalse))self.sigmoid nn.Sigmoid()def forward(self, x):b, c, h, w x.shapeavg_out self.fc(self.avg_pool(x).view(b, c))max_out self.fc(self.max_pool(x).view(b, c))attention self.sigmoid(avg_out max_out).view(b, c, 1, 1)return x * attention2. 空间注意力模块Spatial Attention Module
空间注意力模块的作用是定位关键特征在图像中的具体位置例如物体所在区域。
实现原理
对输入特征图进行通道维度的平均池化和最大池化将两种池化结果拼接后通过卷积层提取空间特征使用Sigmoid函数得到空间注意力权重
class SpatialAttention(nn.Module):def __init__(self, kernel_size7):super().__init__()self.conv nn.Conv2d(2, 1, kernel_size, paddingkernel_size//2, biasFalse)self.sigmoid nn.Sigmoid()def forward(self, x):avg_out torch.mean(x, dim1, keepdimTrue)max_out, _ torch.max(x, dim1, keepdimTrue)pool_out torch.cat([avg_out, max_out], dim1)attention self.conv(pool_out)return x * self.sigmoid(attention)CBAM模块就是将这两个注意力模块串联起来先进行通道注意力调整再进行空间注意力调整
class CBAM(nn.Module):def __init__(self, in_channels, ratio16, kernel_size7):super().__init__()self.channel_attn ChannelAttention(in_channels, ratio)self.spatial_attn SpatialAttention(kernel_size)def forward(self, x):x self.channel_attn(x)x self.spatial_attn(x)return x三、CBAM的优势
轻量级设计仅增加少量计算量全局池化简单卷积适合嵌入各种CNN架构如ResNet、YOLO即插即用无需修改原有模型主体结构直接作为模块插入卷积层之间双重优化同时提升通道和空间维度的特征质量尤其适合复杂场景如小目标检测、语义分割
四、CBAM的实际应用
我们通过在CIFAR-10数据集上的实验展示如何将CBAM模块集成到CNN模型中并观察其效果。
class CBAM_CNN(nn.Module):def __init__(self):super(CBAM_CNN, self).__init__()# 第一个卷积块带CBAMself.conv1 nn.Conv2d(3, 32, kernel_size3, padding1)self.bn1 nn.BatchNorm2d(32)self.relu1 nn.ReLU()self.pool1 nn.MaxPool2d(kernel_size2)self.cbam1 CBAM(in_channels32) # 添加CBAM# 第二个卷积块带CBAMself.conv2 nn.Conv2d(32, 64, kernel_size3, padding1)self.bn2 nn.BatchNorm2d(64)self.relu2 nn.ReLU()self.pool2 nn.MaxPool2d(kernel_size2)self.cbam2 CBAM(in_channels64) # 添加CBAM# 第三个卷积块带CBAMself.conv3 nn.Conv2d(64, 128, kernel_size3, padding1)self.bn3 nn.BatchNorm2d(128)self.relu3 nn.ReLU()self.pool3 nn.MaxPool2d(kernel_size2)self.cbam3 CBAM(in_channels128) # 添加CBAM# 全连接层self.fc1 nn.Linear(128 * 4 * 4, 512)self.dropout nn.Dropout(p0.5)self.fc2 nn.Linear(512, 10)def forward(self, x):# 各卷积块均包含CBAM模块x self.conv1(x)x self.bn1(x)x self.relu1(x)x self.pool1(x)x self.cbam1(x) # 应用CBAMx self.conv2(x)x self.bn2(x)x self.relu2(x)x self.pool2(x)x self.cbam2(x) # 应用CBAMx self.conv3(x)x self.bn3(x)x self.relu3(x)x self.pool3(x)x self.cbam3(x) # 应用CBAMx x.view(-1, 128 * 4 * 4)x self.fc1(x)x self.relu3(x)x self.dropout(x)x self.fc2(x)return x通过训练这个集成CBAM的CNN模型我们在CIFAR-10数据集上观察到明显的性能提升。训练过程中的准确率和损失变化如下图所示
CBAM注意力模块为CNN模型提供了一种强大的特征增强方式。通过同时关注通道重要性和空间位置它显著提升了模型对关键特征的捕捉能力。
在实际应用中我们可以在各种CNN架构中集成CBAM模块
在目标检测任务中帮助模型更精准地定位物体在语义分割任务中提升对不同区域特征的区分能力在图像分类任务中增强对关键判别特征的关注