CBAM (Convolutional Block Attention Module)注意力机制详解

定义与起源

CBAM (Convolutional Block Attention Module) 是一种专为卷积神经网络(CNN)设计的注意力机制, 旨在增强模型对关键特征的捕捉能力 。这一创新概念首次出现在2018年的研究论文《CBAM: Convolutional Block Attention Module》中。CBAM的核心思想是在通道和空间两个维度上进行注意力分配,通过 通道注意力模块(CAM)和空间注意力模块(SAM) 的组合,实现了对输入特征的全面分析和重新加权。

这种方法不仅提高了模型的性能,还增强了其解释性,使网络能够更加聚焦于识别目标物体的关键区域。CBAM的设计巧妙地平衡了性能和计算效率,在多种视觉任务中展现出了显著的效果提升。

核心思想

CBAM的核心思想在于通过 双重注意力机制 来全面提升卷积神经网络的特征提取能力。这种创新的设计理念巧妙地结合了 通道注意力空间注意力 ,使得模型能够从两个关键维度对输入特征进行全面分析和重新加权。

CBAM的核心思想体现在以下几个方面:

  1. 通道注意力机制 :通过全局池化和多层感知机(MLP),CBAM能够自适应地学习每个通道的重要性权重,从而实现对不同

### CBAM注意力机制详细介绍 #### 一、概述 CBAMConvolutional Block Attention Module)是一种用于卷积神经网络中的注意力模块,旨在提升特征表示的质量。该模块结合了通道注意力机制和空间注意力机制,从而实现更精细的特征提取[^2]。 #### 二、通道注意力机制 ##### 特征聚合 为了获取全局信息,在计算过程中会利用最大池化操作以及平均池化操作来压缩输入特征图的空间维度,得到两个描述不同统计特性的向量。这些向量随后被送入一个多层感知器(MLP),其权重共享设计有助于减少参数数量并加速训练过程[^3]。 ##### 权重生成 经过上述处理后的特征会被映射回原始尺寸大小,并通过Sigmoid激活函数转换成范围在0到1之间的权值矩阵。此矩阵代表各个通道的重要性程度,较高的数值意味着对应位置上的响应更为重要。最终,原特征图与产生的权值相乘即可获得带有通道注意力建模的新特征图。 ```python import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, channel, reduction=16): super(ChannelAttention, self).__init__() self.max_pool = nn.AdaptiveMaxPool2d(1) self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel) ) def forward(self, x): b, c, _, _ = x.size() max_out = self.fc(self.max_pool(x).view(b,c)) avg_out = self.fc(self.avg_pool(x).view(b,c)) out = (max_out + avg_out).sigmoid().unsqueeze(-1).unsqueeze(-1) return x * out.expand_as(x) ``` #### 三、空间注意力机制 ##### 描述 完成通道级别的优化之后,接下来是对每一个像素点施加影响——即引入空间注意力机制。这里同样采用两种方式收集上下文线索:沿宽度方向的最大/均值汇聚;沿着高度方向执行相同的操作。接着把两者拼接起来形成一个新的二维张量作为后续全连接层或卷积核的作用对象。 ##### 计算流程 类似于之前的做法,此处也采用了类似的策略去构建一个衡量各处显著度的地图。不过区别在于这次关注的是图像内部的位置关系而非单个channel的表现力。最后一步同样是将这张地图作用于先前已经过一轮筛选的数据集之上,以此达到强化有效区域的效果。 ```python 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.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) y = torch.cat([avg_out, max_out], dim=1) y = self.conv(y) return x * self.sigmoid(y) ``` #### 四、整体架构 综上所述,整个CBAM由两部分组成:首先是针对feature map中每个channel的重要性和贡献度作出评估;其次是考虑到了具体坐标点对于整幅图片的意义所在。当这两者结合起来时便构成了完整的双重视觉焦点调整方案,进而使得CNN具备更强的学习能力和泛化性能。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清风AI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值