SEBlock | ECABlock | CBAM

还是基础哈 自己不劳就弄来学学~~ 图像中的注意力机制

我们知道,输入一张图片,神经网络会提取图像特征,每一层都有不同大小的特征图。如图1所示,展示了 VGG网络在提取图像特征时特征图的大小变化。

图1 VGG网络特征结构图

其中,特征图常见的矩阵形状为[ C , H , W ](图1中的数字为[ H , W , C ] 格式)。当model在training时,特征图的矩阵形状为[ B , C , H , W ]。其中B表示为batch size(批处理大小),C表示为channels(通道数),H表示为特征图的high(高度),W表示为特征图的weight(宽度)

提问:为什么特征图的维度就是[ B , C , H , W ],而不是其他什么维度格式?

回答:pytorch在处理图像时,读入的图像处理为[ C , H , W ]格式,如果在训练时加入batch size,那么就有多个特征图,将batch size放在第一维,自然就是[ B , C , H , W ]。这是pytorch的处理方式

在网络提取图像特征层时,通过在卷积层之间添加通道注意力机制、空间注意力机制可以增强网络提取图像的能力。在编写代码时,考虑的是特征图间的attention机制,因此代码输入是[ B , C , H , W ]的特征图,输出仍然是[ B , C , H , W ] 维的特征图。让我们接下来通过三篇论文来看这两种注意力机制是如何工作的。

二、SENet

1. 论文介绍

论文名称:Squeeze-and-Excitation Networks

链接:https://arxiv.org/pdf/1709.01507.pdf

SEBlock结构图:

 

图2 SEBlock结构图

摘要重点:

卷积神经网络(CNN)的核心组成部分是卷积算子,它使网络能够通过融合每层局部感受野中的空间和通道信息来构建信息特征。之前的大量研究已经调查了这种关系的空间成分,并试图通过在CNN的特征层次中提高空间编码的质量来增强CNN。在这项工作中,我们将重点放在通道(channel-wise)关系上,并提出了一个新的名为SE模块的架构单元,它通过显式地建模通道之间的相互依赖性,自适应地重新校准通道特征响应。这些模块可以堆叠在一起形成SENet网络结构,并在多个数据集上非常有效地推广。

SEBlock创新点:

1.SEBlock会给每个通道一个权重,让不同通道对结果有不同的作用力。

2.这个SE模块能够非常方便地添加进目前主流的神经网络当中。

2. 算法解读

图3展示了通道注意力机制的四个步骤,具体如下:

 

图3 SEBlock模块分析

①.从单张图像开始,提取图像特征,当前特征层U的特征图维度为[ C , H , W ] 

②.对特征图的[ H , W ] ]维度进行平均池化或最大池化,池化过后的特征图大小从[ C , H , W ]->[ C , 1 , 1 ]。[ C , 1 , 1 ]可理解为对于每一个通道C,都有一个数字和其一一对应。图4对应了步骤(2)的具体操作。

图4 平均池化(最大池化)操作,得到每个通道的权重,得到每个通道的权重

③.对[ C , 1 , 1 ]的特征可以理解为,从每个通道本身提取出来的权重,权重表示了每个通道对特征提取的影响力,全局池化后的向量通过MLP网络后,其意义为得到了每个通道的权重。图5对应了步骤(3)的具体操作。

 

图5 通道权重生成

④.上述步骤,得到了每个通道C的权重[ C , 1 , 1 ],将权重作用于特征图U[ C , H , W ],即每个通道各自乘以各自的权重。可以理解为,当权重大时,该通道特征图的数值相应的增大,对最终输出的影响也会变大;当权重小时,该通道特征图的数值就会更小,对最终输出的影响也会变小。图6对应了步骤(4)的具体操作。

 

图6 通道注意力——各通道乘以各自不同权重

原论文中给出了通道注意力网络细节,这里展示出来,如图7所示。

图7 SEBlock实现前(左)后(右)对比

注:文中经过对比实验发现,r 取16的时候效果最好,所以一般默认r = 16,但当通道数很小的时候,需要自己再调整

  3. Pytorch代码实现


                
### ECA通道注意力机制概述 ECA(Efficient Channel Attention)网络是一种高效的通道注意力机制,旨在通过轻量级的设计来增强卷积神经网络的表现力[^3]。传统的方法通常依赖于复杂的结构来进行跨通道交互的学习,而ECA则专注于简化这一过程。 #### 避免维度缩减 与其他方法不同的是,ECA模块不采用常见的降维策略。相反,在设计上刻意绕过了这种做法,从而保留了原始特征图中的更多信息。具体来说,ECA能够有效地捕捉到各个通道之间的相互作用而不必牺牲任何细节。 #### 极其精简的设计 为了实现高效性和计算资源的有效利用,ECA采用了极其简洁的架构。该机制仅需少量参数即可完成强大的表达能力构建工作。这使得它非常适合应用于大规模数据集以及多种视觉识别任务中,如ImageNet-1K 和 MS COCO等实验验证表明其性能优越。 #### 实现方式 下面是一个简单的Python代码片段展示了如何在一个标准ResNet基础上集成ECA模块: ```python import torch.nn as nn class ECABlock(nn.Module): def __init__(self, channels, gamma=2, b=1): super(ECABlock, self).__init__() t = int(abs((math.log(channels, 2) + b) / gamma)) k_size = t if t % 2 else t + 1 self.avg_pool = nn.AdaptiveAvgPool2d(1) self.conv = nn.Conv1d( 1, 1, kernel_size=k_size, padding=(k_size - 1) // 2, bias=False ) self.sigmoid = nn.Sigmoid() def forward(self, x): y = self.avg_pool(x) y = self.conv(y.squeeze(-1).transpose(-1, -2)).transpose(-1, -2).unsqueeze(-1) y = self.sigmoid(y) return x * y.expand_as(x) ``` 此代码定义了一个名为`ECABlock` 的类,实现了基本的ECA功能。其中包含了自适应全局平均池化层、一维卷积操作以及Sigmoid激活函数的应用。这些组件共同协作以生成最终的通道权重矩阵并将其应用回输入张量之上。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值