35、HAM:超强性能的深度卷积神经网络混合注意力模型[五档上坡第一人!]

文章介绍了一种新型的注意力模型HAM,它在兼顾通道和空间注意的同时,通过简化通道注意模块和引入通道分离技术提高了效率。HAM在CIFAR-10等数据集上表现出SOTA性能,对于模型复杂性和性能提供了良好的平衡。

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

大家好,今天给大家解说一个注意力模型,即插即用,性能稳定。本文由燕山大学电气学院,河北省工业计算机控制重点实验室,浙江大学求实高等研究院共同提出,于2022年5月10日发表于<Pattern Recognition >IF:8.4\JCR:Q1 是CV的顶刊哈。让咱们看看他做了哪些工作呢。

论文地址:

HAM: Hybrid attention module in deep convolutional neural networks for image classification (sciencedirectassets.com)

Abstract:

现有注意力机制难以做到对性能和模型复杂性之间的良好权衡,在兼顾通道和空间注意机制的同时带来额外的巨大负担。因此本文提出的HAM通过快速一维卷积来缓解通道注意机制的负担,并引入通道分离技术自适应强调重要特征。HAM作为通用模块,在CIFAR-10、CIFAR-100和STL-10数据集上实现了SOTA级别的分类性能。

Trouble:

本文旨在实现一种轻量且高效的,兼顾通道与空间的注意力机制。此前如CBAM模型也兼顾通道与空间的重要性,但带来较高的模型复杂性。CBAM模块能够序列化地在通道和空间两个维度上产生注意力特征图信息,其结构细节如下图所示:

然而在其通道注意力模块中,多层感知机的应用增加了模型的复杂程度因此设计一种简单有效的注意力模块是非常有必要的,在本文的HAM中,作者等人不仅对通道注意模块的设计进行了简化,同时提出“通道注意特征图代表了不同通道的不同重要性,因此空间注意子模块应该将通道细化特征沿通道轴线分成若干组”,引入通道分离技术,对空间注意模块进行优化。

Methodology:

ResBlock嵌入HAM架构

首先从HAM嵌入ResBlock的整体架构入手,输入特征X首先经过通道注意模块,就像CBAM中的通道注意机制一样,先通过X得到通道注意张量Ac,接着Ac与X相作用得到通道细化特征F'。

然后是空间注意模块,通道分离技术将F'切分为两组不同的特征,一组为重要特征F'1,一组是次重要特征F'2,接着对两个不同分支的特征应用空间注意机制,如CBAM中的空间注意机制一般,先从输入特征F'1和F'2获得空间注意张量As,1和As,2,将空间注意张量作用于输入特征后获得空间细化特征F1''和F2'',将两者特征相融合得到最终的细化特征F'',也即原始输入特征X经过HAM后得到的最终结果。

在CIFAR-10、CIFAR-100和STL-10数据集的分类任务中,HAM可以达到SOTA级别的性能。下面将对HAM的各部分细节进行详细描述:

CAM:

如图,输入特征首先经过两个分支的不同池化得到Favg和Fmax,这与CBAM中保持一致,平均池化可以学习到目标物体的程度信息,最大池化则能够学习到物体的判别性特征,同时使用的话,最大池化编码目标的显著性信息,能够很好地弥补平均池化编码的全局信息。

然而作者等人认为“平均池化和最大池化在图像特征提取的不同阶段发挥着不同的作用”,并根据此设计了一种自适应的选择机制。如图中的Adaptive mechanism Block所示,分别乘以可学习参数和(两者均为0到1之间的浮点数),同时各自乘1/2后再相加,最后三者进行逐元素相加得到,该过程可用如下公式表示:

最终得到的Fc中不仅对原有特征信息进行了保留,同时自适应调整特征倾向,丰富了特征。

最后HAM使用快速一维卷积而不是MLP来实现跨通道的信息交互,这样做的好处有两点:

1.模型的复杂性大大降低;

2.模型性能将不受通道降维的影响。

3.快速一维卷积拥有自适应核大小K,其大小由通道数C决定(公式中其他量均为超参数),其计算公式如下:

最终的通道注意张量Ac由特征经Sigmoid函数激活后输出,并与原输入特征作用得到通道细化特征F‘,该特征将作为下一步空间注意模块的输入。

SAM:

如图,输入特征F’为经过通道注意模块的通道细化特征,其中每个通道都具有不同的重要性(在数值表现上,通道注意张量Ac中重要的通道权重更大)因此作者等人提出应将通道细化特征F‘沿通道轴线进行划分,重要特征分为一组,次重要特征分为一组。

如何实现这一操作:

作者等人引入一个超参数来控制,将F’与的通道维度相乘,即可得到重要特征组的通道维度(需要注意乘积结果取最近偶数值)。然后利用这一重要特征通道维度,定义两种掩码组,一组掩码由重要特征为1,次重要特征为0组成,另一种掩码则刚好相反。将两种掩码与输入特征F‘分别进行逐元素相乘,就得到了两组分离后的特征,如图所示,F1’和F2‘即为分离后的特征。

同CBAM中空间注意模块一样,对F1’和F2‘进行两种池化,并将池化结果拼接,得到两组输出特征。接着这两组特征被内核大小为7×7的共享卷积层卷积,生成两组大小为H×W×1的特征图,分别经归一化和激活操作得到对应的空间注意张量As,1和As,2。

将As,1和As,2分别与分离后的特征F1'和F2'相乘,得到对应的空间细化特征F1''和F2'',将二者逐元素相加,即为最终的细化特征,至此HAM模块结束。

关于通道注意模块和空间注意模块的排序问题:

有读者可能会想到能否将通道和空间注意模块的顺序进行调换甚至并行,其实早在CBAM中就对这一问题进行过实验验证,因为两种注意机制的作用不同,因此序列的使用两种注意机制,效果要优于并行的使用,而且先通道再空间的序列使用效果优于先空间再通道。

Valid:

在实验部分,作者等人依次对各种通道注意模块、空间注意模块进行性能对比,并对空间注意模块中不同的通道分离率进行单独的实验验证。

Result:

本文通过对以往兼顾通道、空间的注意机制进行思考,设计一种简单有效的注意模块,实现了性能和模型复杂度之间的良好权衡。

在通道注意模块中,通过自适应的特征选择机制实现了不同阶段的特征倾向,并对传统的MLP进行改进,以自适应核大小的快速一维卷积来代替,既避免了通道降维的影响,又大幅度降低了参数量。

在空间注意模块中,创新的提出通道分离技术,将重要特征与次重要特征“区别”对待,并以共享卷积层来建立2D注意力图。

写在最后:

大家可以尝试使用HAM加到一些模型中,比如EEGNet等模型,去处理EEG、EMG等数据,那这个HAM怎样加,加在哪好,加进去数据输入shape怎样设计是新的新题和挑战啦。

也欢迎大家加入我们的脑机接口群聊,本人每天会分享一些资料,主要是CNN、RNN,Transfomer等DL模型用于处理BCI生理数据,涉及到BCI数据的预处理,特征工程,建模(ML,DL都有),结果可视化(混淆,ACC、AUC、F1等值)一套完整的流程,助力大家使用深度学习处理BCI数据。最后也会不定时发一些数据集,涉及到运动想象MI、情感分类、疲劳、SSVEP、心电、EMG、血氧数据等等。欢迎加入,随时交流,我随时解答~

大家踊跃进群,先到先得~因为前面发的资料后加入的就看不到了。。

### HAM注意力机制在小目标检测中的应用 对于小目标检测而言,混合注意力机制(HAM, Hybrid Attention Mechanism)能够显著提升模型对细节特征的关注度。具体来说,在处理图像数据时,通过Heatmap可视化方法可以直观展示不同注意力机制下模型关注的重点区域[^1]。 #### 方法概述 HAM融合了空间注意力与通道注意力的优势,旨在增强网络对重要信息的理解能力。针对小物体识别困难这一挑战,该机制允许更精准地定位微小且密集分布的目标对象。其核心在于引入多尺度感受野以及跨层连接设计,从而有效捕捉局部细微变化并抑制背景噪声干扰。 #### 实现过程 以下是基于PyTorch框架的一个简化版HAM模块实现: ```python import torch.nn as nn import torch 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.conv1 = 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) scale = torch.cat([avg_out, max_out], dim=1) scale = self.conv1(scale) return x * self.sigmoid(scale) 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.fc1 = nn.Conv2d(in_planes, in_planes // ratio, 1, bias=False) self.relu1 = nn.ReLU() self.fc2 = nn.Conv2d(in_planes // ratio, in_planes, 1, bias=False) self.sigmoid = nn.Sigmoid() def forward(self, x): avg_out = self.fc2(self.relu1(self.fc1(self.avg_pool(x)))) max_out = self.fc2(self.relu1(self.fc1(self.max_pool(x)))) out = avg_out + max_out return self.sigmoid(out) * x class HAMBlock(nn.Module): def __init__(self, channel_in, spatial_kernel=7): super(HAMBlock, self).__init__() self.channel_attention = ChannelAttention(channel_in) self.spatial_attention = SpatialAttention(spatial_kernel) def forward(self, x): ca_output = self.channel_attention(x) sa_output = self.spatial_attention(ca_output) return sa_output ``` 上述代码定义了一个简单的`HAMBlock`类,它包含了两个子组件——`ChannelAttention`和`SpatialAttention`。这两个部分共同作用于输入张量`x`之上,最终输出经过双重注意调整后的特征映射。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

是馒头阿

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

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

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

打赏作者

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

抵扣说明:

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

余额充值