【论文阅读】一些轻量的有效的attention module的介绍

本文介绍了深度学习中广泛采用的注意力机制模块,如CBAM、BAM和CoordinateAttention等。这些模块通过通道注意力和空间注意力提升模型对特征图重要性的识别。CBAM结合了通道和空间注意力,BAM利用膨胀卷积扩大感受野,而CoordinateAttention综合通道和位置信息。这些方法在减少参数量的同时提高了模型性能,适用于多种神经网络架构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在看论文,发现很多的论文都用到了attentive moudule。
这也得益于越来越多的实验证明自注意力机制对于:什么是重要的?这个问题的合理解决。相比传统的直接生成特征图,对于每一个item进行同样的卷积提取特征等操作,让神经网络来自己学习哪部分是前景,哪部分是背景噪声,不重要,加入一个attentive module是一个很聪明的办法。
现在学术界涌现出许多的attentive module的设计方法,主要还是应用在2d目标检测领域。
这篇博客主要是对于一些开源的影响力大的模块进行一个介绍。

CMBA

论文题目:CBAM: Convolutional Block Attention Module
eccv2018 已经开源
在这里插入图片描述
这篇文章思考了两个问题,对于一个输入的特征图(HWC),什么(what)是重要的,以及哪一块(where)是重要的。
在这里插入图片描述

所以文章架构如上,这个attention module主要包含两个部分:
channel attention module
这个部分解决(what)的问题。
对于输入的特征图,这是个什么东西?我们在网络中常用的方法又max pool 和mean pool。这两种featuer aggregation的方法各有优劣,文章将两者结合起来进行操作。
在这里插入图片描述
其实没啥好说的,有深度学习基础的同学看到上面的图基本可以知道作者是怎么做的。
在这里插入图片描述
经过该模块我们得到一个11C的vector,这表示的便是这个特征图它代表什么东西。
Spatial attention module
这个模块则主要解决“where”的问题,特征图的哪一块信息是重要的?
主要是在channel维度进行max和mean操作,集合每一个voxel的所有信息。然后将它们进行一个拼接后进行conv操作。最后激活函数进行激活。得到的是一个HW1的特征图。
在这里插入图片描述

在这里插入图片描述

这两个模块进行串联得到了最好的结果。
在resnet中进行了这样的应用:

在这里插入图片描述

模块参数很少很轻、可以在神经网络中广泛应用。比如之前我讲过的一篇文章HVPR便应用了spatial attention。以及trans上一篇文章:SIEV-Net。

BAM: Bottleneck Attention Module

cmba同组同时期的作品。
British Machine Vision Association2018
基本思路是一样的,不过总体框架不一样:
在这里插入图片描述
channel branch是一样的:
在这里插入图片描述
spatial attention branch
这个层面的attention计算主要是要扩大每一个pixel在hw维度上的感受野 作者引入了膨胀卷积 主要是首先1x1维度的卷积进行channel减小 随后3x3的卷积进行感受野扩大 最后1X1的卷积生成HW1的feature

对于上述两个通道得到的feature map 将它们进行扩张到HWC维度 经过一盒sigmoid函数激活 再与原来的input tensor 进行元素级别的相乘

Coordinate Attention

论文题目:Coordinate Attention for Efficient Mobile Network Design
新加坡国立 2021cvpr
这篇文章主要是在SE上进行改进的。se直接进行global pool 显然是会失去位置信息的。这样子强调了channel维度的信息。
而我们熟悉的cmba则是通过channel 和 spatial串联得到的。这种方法是不是suboptimal的还没有一个定论。
这种方法则是将channel 和spatial维度综合起来
在这里插入图片描述
首先计算H和W维度的位置信息:
在这里插入图片描述
concat起来后 作为一个维度进行linear函数处理及激活 最后分开为两个维度 对于featuremap进行加权
很简单的思想 却实现了两种方案。

效果好于cmba
在这里插入图片描述

NAM

论文标题:NAM: Normalization-based Attention Module
nips的workshop
主要是用bn在cmba上进行改进 思路跟简单:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
效果也不错 不过代码维护得不太好
在这里插入图片描述

<think>好的,我需要回答用户关于Convolutional Block Attention Module (CBAM)的问题。首先,用户可能想了解CBAM的基本概念、结构、实现和应用。根据用户的提示,他们提到了ECCV2018的论文和PyTorch实现,所以需要结合这些信息。 首先,我应该回顾CBAM的结构。CBAM包含通道注意力和空间注意力两个部分。通道注意力模块使用平均池化和最大池化,然后通过多层感知机(MLP)生成通道权重。空间注意力模块则是在通道维度上进行池化,然后通过卷积层生成空间权重。两个模块依次应用,增强特征图的表达能力。 接下来是PyTorch实现部分。用户提供的参考是PyTorch实现的CBAM,所以需要给出一个代码示例。需要确保代码结构正确,符合论文描述。比如,通道注意力中的MLP层,使用1x1卷积代替全连接层,这在图像处理中更常见。空间注意力模块中的卷积层使用7x7的滤波器,这是论文中的参数。 然后,关于使用方式,用户可能想知道如何将CBAM集成到现有的网络中,比如ResNet。需要说明CBAM可以加在卷积块之后,例如在残差块的卷积层之后插入CBAM模块。此外,应用场景如分类、检测、分割等,都需要举例说明,说明注意力机制如何提升模型性能。 还需要检查是否需要补充其他信息,比如CBAM的优势,如轻量级、即插即用,以及可能的影响因素,比如在不同层使用CBAM的效果差异。同时,确保回答符合用户的要求,如使用中文、数学公式的正确格式,以及生成相关问题。 最后,生成的相关问题需要覆盖原理、实现细节、应用比较和优化等方面,帮助用户进一步探索。确认引用格式正确,末尾添加引用标识[^1]。整个过程需要结构清晰,分点说明,代码示例正确,并且语言简洁明了。</think>### Convolutional Block Attention Module (CBAM) #### 1. 核心原理 CBAM是一种轻量级注意力模块,通过**通道注意力**和**空间注意力**的级联设计增强卷积特征。其数学表达为: $$ \begin{aligned} \text{通道注意力权重} & : \mathbf{M}_c(F) = \sigma(MLP(AvgPool(F)) + MLP(MaxPool(F))) \\ \text{空间注意力权重} & : \mathbf{M}_s(F) = \sigma(f^{7\times7}([AvgPool(F); MaxPool(F)])) \end{aligned} $$ 其中$F$为输入特征图,$\sigma$为sigmoid函数,$f^{7\times7}$为7x7卷积操作。 #### 2. PyTorch实现代码 ```python import torch import torch.nn as nn class ChannelAttention(nn.Module): def __init__(self, in_planes, ratio=16): super().__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.max_pool = nn.AdaptiveMaxPool2d(1) self.fc = nn.Sequential( nn.Conv2d(in_planes, in_planes//ratio, 1, bias=False), nn.ReLU(), nn.Conv2d(in_planes//ratio, in_planes, 1, bias=False) ) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc(self.avg_pool(x)) max_out = self.fc(self.max_pool(x)) return self.sigmoid(avg_out + max_out) class SpatialAttention(nn.Module): def __init__(self, kernel_size=7): super().__init__() self.conv = nn.Conv2d(2, 1, kernel_size, padding=kernel_size//2, 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) combined = torch.cat([avg_out, max_out], dim=1) return self.sigmoid(self.conv(combined)) class CBAM(nn.Module): def __init__(self, in_planes): super().__init__() self.ca = ChannelAttention(in_planes) self.sa = SpatialAttention() def forward(self, x): x = self.ca(x) * x # 通道注意力 x = self.sa(x) * x # 空间注意力 return x ``` #### 3. 使用方式 1. **集成到CNN架构**:可插入ResNet等网络的残差块中: ```python class ResBlock_CBAM(nn.Module): def __init__(self, in_channels): super().__init__() self.conv1 = nn.Conv2d(in_channels, in_channels, 3, padding=1) self.cbam = CBAM(in_channels) self.conv2 = nn.Conv2d(in_channels, in_channels, 3, padding=1) def forward(self, x): residual = x x = F.relu(self.conv1(x)) x = self.cbam(x) x = self.conv2(x) x += residual return F.relu(x) ``` 2. **应用场景**: - 图像分类:在ResNet中插入CBAM模块可使ImageNet Top-1准确率提升约1.5%[^1] - 目标检测:增强目标区域的特征响应 - 语义分割:改善边缘细节特征表示
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值