注意力特征融合

news2024/9/20 9:25:57

摘要

https://arxiv.org/pdf/2009.14082

在这里插入图片描述

特征融合,即来自不同层或分支的特征的组合,是现代网络架构中无处不在的一部分。它通常通过简单的操作来实现,如求和或拼接,但这可能不是最佳选择。在这项工作中,我们提出了一种统一且通用的方案,即注意力特征融合,它适用于大多数常见场景,包括由短连接和长连接引起的特征融合以及Inception层内的特征融合。为了更好地融合不一致的语义和尺度的特征,我们提出了一个多尺度通道注意力模块,该模块解决了在融合不同尺度特征时出现的问题。我们还证明了特征图的初始融合可能成为瓶颈,并且可以通过添加另一层注意力来缓解这个问题,我们称之为迭代注意力特征融合。我们的模型在CIFAR-100和ImageNet数据集上的表现优于最先进的网络,同时使用的层数或参数更少,这表明更复杂的特征融合注意力机制在一致地产生更好结果方面具有巨大潜力,与直接融合方法相比具有显著优势。我们的代码和训练模型可在网上获得[1]

1、引言

卷积神经网络(CNN)通过加深[12]、加宽1、增加基数[47]和动态细化特征[16]^等方式,显著提高了表示能力,从而在许多计算机视觉任务中取得了进步。

除了这些策略外,本文还研究了网络的不同组成部分——特征融合,以进一步提升CNN的表示能力。无论是显式还是隐式、有意还是无意,特征融合在现代网络架构中无处不在,并在以往的文献中得到了广泛研究[38,36,12,30,23]。例如,在InceptionNet系列[38,39,37]中,同一层级上多个尺寸滤波器的输出被融合以处理对象大小的巨大变化。在残差网络(ResNet)2及其后续版本[49, 47]中,恒等映射特征和残差学习特征通过短连接融合为输出,从而能够训练非常深的网络。在特征金字塔网络(FPN)[23]和U-Net[30]^中,低级特征和高级特征通过长连接融合以获得高分辨率和语义上强大的特征,这对于语义分割和对象检测至关重要。然而,尽管特征融合在现代网络中普遍存在,但大多数关于特征融合的研究都集中在构建复杂的路径来组合不同核、组或层的特征上。特征融合方法很少被提及,通常通过简单的加法或拼接操作来实现,这些方法仅提供了特征图的固定线性聚合,并且完全不知道这种组合是否适用于特定对象。

最近,提出了选择性核网络(SKNet)[21]和ResNeSt[51],它们基于全局通道注意力机制[16],实现了同一层内来自多个核或组的特征的动态加权平均。尽管这种基于注意力的方法为特征融合提供了非线性方法,但它们仍然存在以下缺点:

  1. 场景有限:SKNet和ResNeSt仅关注同一层内的软特征选择,而跨层的跳跃连接融合尚未得到解决,这使得它们的方案相当启发式。尽管场景不同,但各种特征融合实现本质上都面临着同样的挑战,即如何整合不同尺度的特征以获得更好的性能。一个能够克服语义不一致性并有效整合不同尺度特征的模块应该能够在各种网络场景中一致地提高融合特征的质量。然而,迄今为止,仍然缺乏一种能够一致地统一不同特征融合场景的通用方法。

  2. 初始整合不精细:为了将接收到的特征输入到注意力模块中,SKNet以非自愿但不可避免的方式引入了另一阶段的特征融合,我们称之为初始整合,并通过加法来实现。因此,除了注意力模块的设计外,作为其输入的初始整合方法对融合权重的质量也有很大影响。考虑到特征在尺度和语义层面上可能存在很大的不一致性,忽略这一问题的粗糙初始整合策略可能成为瓶颈。

  3. 上下文聚合尺度有偏差:SKNet和ResNeSt中的融合权重是通过全局通道注意力机制[16]生成的,该机制更适用于全局分布的信息。然而,图像中的对象大小可能有极大变化。许多研究都强调了在设计CNN时出现的这个问题,即预测器的感受野应与对象尺度范围相匹配[52,33,34,22]。因此,仅仅在全局尺度上聚合上下文信息过于片面,并削弱了小对象的特征。这引发了一个问题:网络是否能够以上下文尺度感知的方式动态且自适应地融合接收到的特征?

受上述观察的启发,我们提出了注意力特征融合(AFF)模块,试图回答如何为各种特征融合场景提供一个统一的方法,并解决上下文聚合和初始整合的问题。AFF框架将基于注意力的特征融合从同层场景推广到跨层场景,包括短连接和长连接,甚至包括AFF内部的初始整合。它提供了一种通用且一致的方法来提升各种网络(如InceptionNet、ResNet、ResNeXt[47]和FPN)的性能,只需将现有的特征融合算子替换为提出的AFF模块即可。此外,AFF框架支持通过另一个AFF模块迭代地整合接收到的特征来逐步细化初始整合,即融合权重生成器的输入,我们称之为迭代注意力特征融合(iAFF)。

为了缓解由尺度变化和小对象引起的问题,我们认为注意力模块也应该为不同尺度的对象从不同感受野中聚合上下文信息。更具体地说,我们提出了多尺度通道注意力模块(MS-CAM),这是一种简单而有效的方法,用于解决注意力特征融合中不同尺度间的特征不一致性问题。我们的关键观察是,尺度不仅仅是空间注意力的问题,通道注意力也可以通过改变空间池化大小来具有全局以外的尺度。通过沿通道维度聚合多尺度上下文信息,MS-CAM可以同时强调全局分布更广的大对象并突出局部分布更多的小对象,有助于网络在极端尺度变化下识别和检测对象。

2、相关工作

2.1、多尺度注意力机制

物体尺度的变化是计算机视觉领域的关键挑战之一。为了解决这个问题,一个直观的方法是利用多尺度图像金字塔[29, 2],其中物体在多个尺度上被识别,并且预测结果通过非极大值抑制进行合并。另一种努力方向是利用卷积神经网络(CNN)固有的多尺度、层次化的特征金字塔来近似图像金字塔,其中多个层的特征被融合以获得高分辨率的语义特征[11, 30, 23]。

深度学习中的注意力机制模仿了人类的视觉注意力机制[5, 8],最初是在全局尺度上开发的。例如,自注意力中的矩阵乘法提取了句子中每个词或图像中每个像素的全局依赖关系[41, 7, 44, 1]。挤压与激励网络(SENet)通过全局平均池化将全局空间信息压缩成通道描述符,以捕获通道间的依赖关系[16]。最近,研究人员开始考虑注意力机制的尺度问题。类似于上述处理CNN中尺度变化的方法,多尺度注意力机制通过将多尺度特征输入到注意力模块中或在注意力模块内部组合多个尺度的特征上下文来实现。在第一类中,多个尺度的特征或其串联结果被输入到注意力模块中以生成多尺度注意力图,而注意力模块内部特征上下文聚合的尺度仍然保持单一[2,4,45,6,35,40]。第二类,也称为多尺度空间注意力,通过在注意力模块内部使用不同大小的卷积核[20]或从金字塔[20,43]中聚合特征上下文。

提出的MS-CAM遵循ParseNet[25]中结合CNN中的局部和全局特征的思想,以及注意力模块内部聚合多尺度特征上下文的空间注意力思想,但在至少两个重要方面有所不同:1)MS-CAM提出了通道注意力中的尺度问题,并通过逐点卷积而不是不同大小的卷积核来实现。2)不是在主干网络中,MS-CAM在通道注意力模块内部聚合局部和全局特征上下文。据我们所知,多尺度通道注意力以前从未被讨论过。

2.2、深度学习中的跳跃连接

跳跃连接是现代卷积网络的重要组成部分。短跳跃连接,即在残差块内添加的恒等映射快捷方式,为梯度在反向传播过程中提供了另一条无中断的路径[12, 47, 49]。长跳跃连接通过桥接较低层的更精细细节特征和较高层的粗分辨率高级语义特征,帮助网络获得高分辨率的语义特征[17, 23, 30, 26]。尽管跳跃连接被用于组合各种路径中的特征[9],但连接特征的融合通常通过加法或拼接来实现,这些方法无论内容变化如何,都为特征分配固定权重。最近,一些基于注意力的方法,如全局注意力上采样(GAU)[20]和跳跃注意力(SA)[48],已被提出用于使用高级特征作为指导来调制长跳跃连接中的低级特征。然而,调制特征的融合权重仍然是固定的。

据我们所知,是Highway Networks首次在短跳跃连接中引入了选择机制[36]。在某种程度上,本文提出的注意力跳跃连接可以视为其后续工作,但在三个方面有所不同:1)Highway Networks使用一个简单的全连接层,只能生成标量融合权重,而本文提出的MSCAM生成与特征图大小相同的融合权重,从而实现逐元素的动态软选择。2)Highway Networks仅使用一个输入特征来生成权重,而我们的AFF模块则同时考虑两个特征。3)我们指出了初始特征融合的重要性,并提出了iAFF模块作为解决方案。

3、多尺度通道注意力

3.1、重新审视SENet中的通道注意力

给定一个中间特征 X ∈ R C × H × W \mathbf{X} \in \mathbb{R}^{C \times H \times W} XRC×H×W,具有 C C C个通道和大小为 H × W H \times W H×W的特征图,SENet中的通道注意力权重 w ∈ R C \mathbf{w} \in \mathbb{R}^{C} wRC可以计算为

w = σ ( g ( X ) ) = σ ( B ( W 2 δ ( B ( W 1 ( g ( X ) ) ) ) ) ) , \mathbf{w}=\sigma(\mathbf{g}(\mathbf{X}))=\sigma\left(\mathcal{B}\left(\mathbf{W}_{2} \delta\left(\mathcal{B}\left(\mathbf{W}_{1}(g(\mathbf{X}))\right)\right)\right)\right), w=σ(g(X))=σ(B(W2δ(B(W1(g(X)))))),

其中 g ( X ) ∈ R C \mathbf{g}(\mathbf{X}) \in \mathbb{R}^{C} g(X)RC表示全局特征上下文,且 g ( X ) = 1 H × W ∑ i = 1 H ∑ j = 1 W X [ : , i , j ] g(\mathbf{X})=\frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} \mathbf{X}_{[:, i, j]} g(X)=H×W1i=1Hj=1WX[:,i,j]是全局平均池化(GAP)。 δ \delta δ表示修正线性单元(ReLU)[27], B \mathcal{B} B表示批量归一化(BN)[18]。 σ \sigma σ是Sigmoid函数。这是通过一个具有两个全连接(FC)层的瓶颈实现的,其中 W 1 ∈ R C r × C \mathbf{W}_{1} \in \mathbb{R}^{\frac{C}{r} \times C} W1RrC×C是降维层, W 2 ∈ R C × C r \mathbf{W}_{2} \in \mathbb{R}^{C \times \frac{C}{r}} W2RC×rC是升维层。 r r r是通道降维比率。

我们可以看到,通道注意力将每个大小为 H × W H \times W H×W的特征图压缩成一个标量。这种极端的粗略描述符倾向于强调全局分布的大型物体,并可能消除小型物体中的大部分图像信号。然而,检测非常小的物体是现有最先进网络的关键性能瓶颈[34]。例如,COCO数据集的难度很大程度上是因为大多数物体实例小于图像面积的 1 % 1\% 1%[24,33]。因此,全局通道注意力可能不是最佳选择。注意力模块内部应该聚合多尺度特征上下文,以缓解由尺度变化和小型物体实例引起的问题。

3.2、聚合局部和全局上下文

在本部分中,我们详细描述了提出的多尺度通道注意力模块(MS-CAM)。关键思想是通过改变空间池化大小在多个尺度上实现通道注意力。为了尽可能保持其轻量级,我们仅在注意力模块内部将局部上下文添加到全局上下文中。我们选择逐点卷积(PWConv)作为局部通道上下文聚合器,它仅利用每个空间位置的逐点通道交互。为了节省参数,局部通道上下文 L ( X ) ∈ R C × H × W \mathbf{L}(\mathbf{X}) \in \mathbb{R}^{C \times H \times W} L(X)RC×H×W通过以下瓶颈结构计算得出:

L ( X ) = B ( PWConv ⁡ 2 ( δ ( B ( PWConv ⁡ 1 ( X ) ) ) ) ) \mathbf{L}(\mathbf{X})=\mathcal{B}\left(\operatorname{PWConv}_{2}\left(\delta\left(\mathcal{B}\left(\operatorname{PWConv}_{1}(\mathbf{X})\right)\right)\right)\right) L(X)=B(PWConv2(δ(B(PWConv1(X)))))

其中, P W C o n v 1 \mathrm{PWConv}_{1} PWConv1 P W C o n v 2 \mathrm{PWConv}_{2} PWConv2的卷积核大小分别为 C r × C × 1 × 1 \frac{C}{r} \times C \times 1 \times 1 rC×C×1×1 C × C r × 1 × 1 C \times \frac{C}{r} \times 1 \times 1 C×rC×1×1。值得注意的是, L ( X ) \mathbf{L}(\mathbf{X}) L(X)与输入特征具有相同的形状,这可以保留并突出低级特征中的细微细节。给定全局通道上下文 g ( X ) \mathbf{g}(\mathbf{X}) g(X)和局部通道上下文 L ( X ) \mathbf{L}(\mathbf{X}) L(X),通过MS-CAM细化后的特征 X ′ ∈ R C × H × W \mathbf{X}^{\prime} \in \mathbb{R}^{C \times H \times W} XRC×H×W可以按以下方式获得:

X ′ = X ⊗ M ( X ) = X ⊗ σ ( L ( X ) ⊕ g ( X ) ) , \mathbf{X}^{\prime}=\mathbf{X} \otimes \mathbf{M}(\mathbf{X})=\mathbf{X} \otimes \sigma(\mathbf{L}(\mathbf{X}) \oplus \mathbf{g}(\mathbf{X})), X=XM(X)=Xσ(L(X)g(X)),

其中 M ( X ) ∈ R C × H × W \mathbf{M}(\mathbf{X}) \in \mathbb{R}^{C \times H \times W} M(X)RC×H×W表示由MS-CAM生成的注意力权重。 ⊕ \oplus 表示广播加法, ⊗ \otimes 表示逐元素乘法。

在这里插入图片描述

4、注意力特征融合

4.1、特征融合场景的统一

给定两个特征图 X , Y ∈ R C × H × W \mathbf{X}, \mathbf{Y} \in \mathbb{R}^{C \times H \times W} X,YRC×H×W,默认情况下,我们假设 Y \mathbf{Y} Y 是具有更大感受野的特征图。更具体地说:

  1. 同层场景 X \mathbf{X} X 是InceptionNet中一个 3 × 3 3 \times 3 3×3核的输出,而 Y \mathbf{Y} Y 5 × 5 5 \times 5 5×5核的输出;
  2. 短跳跃连接场景 X \mathbf{X} X 是恒等映射,而 Y \mathbf{Y} Y是ResNet块中学习的残差;
  3. 长跳跃连接场景 X \mathbf{X} X 是低级特征图,而 Y \mathbf{Y} Y是特征金字塔中的高级语义特征图。

基于多尺度通道注意力模块M,注意力特征融合(AFF)可以表示为

Z = M ( X ⊎ Y ) ⊗ X + ( 1 − M ( X ⊎ Y ) ) ⊗ Y , \mathbf{Z}=\mathbf{M}(\mathbf{X} \uplus \mathbf{Y}) \otimes \mathbf{X}+(1-\mathbf{M}(\mathbf{X} \uplus \mathbf{Y})) \otimes \mathbf{Y}, Z=M(XY)X+(1M(XY))Y,

其中 Z ∈ R C × H × W \mathbf{Z} \in \mathbb{R}^{C \times H \times W} ZRC×H×W 是融合后的特征, ⊎ \uplus 表示初始特征整合。在本小节中,为了简化,我们选择逐元素求和作为初始整合。AFF在图2(a)中进行了说明,其中虚线表示 1 − M ( X ⊎ Y ) \mathbf{1}-\mathbf{M}(\mathbf{X} \uplus \mathbf{Y}) 1M(XY)。需要注意的是,融合权重 M ( X ⊎ Y ) \mathbf{M}(\mathbf{X} \uplus \mathbf{Y}) M(XY) 包含0到1之间的实数,同样 1 − M ( X ⊎ Y ) 1-\mathbf{M}(\mathbf{X} \uplus \mathbf{Y}) 1M(XY) 也是,这使得网络能够在 X \mathbf{X} X Y \mathbf{Y} Y 之间进行软选择或加权平均。
在这里插入图片描述

我们在表1中总结了深度网络中特征融合的不同公式。G表示全局注意力机制。尽管多种方法在处理各种特征融合场景时存在许多实现上的差异,但一旦抽象成数学形式,这些细节上的差异就会消失。因此,通过精心设计的方法统一这些特征融合场景是可能的,从而通过用这种统一方法替换原始融合操作来提高所有网络的性能。
在这里插入图片描述

从表1中可以进一步看出,除了权重生成模块 G \mathbf{G} G 的实现外,最先进的融合方案主要在两个关键点上有所不同:(a)上下文感知级别。像加法和拼接这样的线性方法是完全上下文无关的。特征细化和调制是非线性的,但只对输入特征图部分感知。在大多数情况下,它们仅利用高级特征图。完全上下文感知的方法利用两个输入特征图进行指导,但代价是提高初始整合问题。(b)细化与调制与选择。在软选择方法中,应用于两个特征图的权重之和必须为1,而对于细化和调制则不是这样。

4.2、迭代注意力特征融合

与部分上下文感知方法[20]不同,完全上下文感知方法有一个不可避免的问题,即如何初步整合输入特征。作为注意力模块的输入,初始整合的质量可能深刻影响最终的融合权重。由于这仍然是一个特征融合问题,一个直观的方法是用另一个注意力模块来融合输入特征。我们称这种两阶段方法为迭代注意力特征融合(iAFF),如图2(b)所示。然后,等式(4)中的初始整合 X ⊎ Y \mathbf{X} \uplus \mathbf{Y} XY 可以重新表述为

X ⊎ Y = M ( X + Y ) ⊗ X + ( 1 − M ( X + Y ) ) ⊗ Y \mathbf{X} \uplus \mathbf{Y}=\mathbf{M}(\mathbf{X}+\mathbf{Y}) \otimes \mathbf{X}+(1-\mathbf{M}(\mathbf{X}+\mathbf{Y})) \otimes \mathbf{Y} XY=M(X+Y)X+(1M(X+Y))Y

4.3、示例:InceptionNet、ResNet和FPN

为了验证提出的 A F F / i A F F \mathrm{AFF} / \mathrm{iAFF} AFF/iAFF 作为统一和通用方案的有效性,我们选择ResNet、FPN和InceptionNet作为最常见的场景示例:短跳跃连接、长跳跃连接以及同层融合。通过将原始加法或拼接替换为AFF/iAFF,可以很容易地将AFF/iAFF应用于现有网络。具体来说,我们将InceptionNet模块中的拼接以及ResNet块(ResBlock)和FPN中的加法替换为注意力网络,我们分别称之为AFF-Inception模块、AFF-ResBlock和AFF-FPN。这种替换和我们提出的架构方案如图3所示。iAFF是AFF的一个特例,因此不需要另一个说明。
在这里插入图片描述

5、实验

为了实验评估,我们采用了以下基准数据集:CIFAR-100[19]和ImageNet[31],用于在同层InceptionNet和短跳跃连接ResNet场景下的图像分类,以及StopSign(COCO数据集[24]的一个子集)用于长跳跃连接FPN场景下的语义分割。详细设置列在表2中。请注意,我们的CIFAR-100实验将图像分类为20个超类,而不是100个类。这是MXNet/Gluon中CIFAR100类的默认设置。直到在相机就绪日我们的GitHub仓库中出现了一个错误问题,我们才发现这一点。然而,由于所有CIFAR-100实验都是在相同数量的类别上进行的,因此从实验结果中得出的结论仍然有效。有关更多实现细节,请参阅补充材料和我们的代码。

5.1、消融研究

5.1.1、多尺度上下文聚合的影响

为了研究多尺度上下文聚合的影响,我们在图4中构建了两个消融模块“Global + Global”和“Local + Local”,其中两个上下文聚合分支的尺度被设置为相同,要么是全局的,要么是局部的。提出的AFF在这里被称为“Global + Local”。它们都具有相同的参数数量。唯一的区别是它们的上下文聚合尺度。
在这里插入图片描述

表3展示了它们在CIFAR-100、ImageNet和StopSign上不同宿主网络上的比较。可以看出,在所有设置中,多尺度上下文聚合(Global + Local)均优于单尺度上下文聚合。结果表明,多尺度特征上下文对于注意力特征融合至关重要。
在这里插入图片描述

5.1.2、特征整合类型的影响

此外,我们在表1中研究了哪种特征融合策略是最好的。为了公平起见,我们基于提出的MS-CAM重新实现了这些方法以生成注意力权重。由于MS-CAM与它们原始的注意力模块不同,我们在这些新实现的方案前加上了“MS-”前缀。为了保持参数预算相同,这里MS-GAU、MSSE、MS-SA和AFF中的通道降维比率r为2,而iAFF中的r为4。

表4提供了三种场景下的比较结果,从中可以看出:1)与线性方法(即加法和拼接)相比,具有注意力机制的非线性融合策略始终提供更好的性能;2)我们的完全上下文感知和选择性策略略优于其他方法,表明它应该优先用于多特征整合;3)在大多数情况下,提出的iAFF方法显著优于其他方法。结果强烈支持我们的假设,即早期整合质量对注意力特征融合有很大影响,而另一层次的注意力特征融合可以进一步提高性能。然而,这种改进可能是以增加优化难度为代价获得的。我们注意到,当网络深度随着b从3增加到4时,iAFFResNet的性能没有提高反而下降。
在这里插入图片描述

5.1.3、对定位和小目标的影响

为了研究提出的MS-CAM对目标定位和小目标识别的影响,我们将GradCAM[32]应用于ResNet-50、SENet-50和AFF-ResNet-50,以可视化ImageNet数据集图像的结果,如图6所示。给定一个特定类别,Grad-CAM结果清楚地显示了网络关注的区域。在这里,我们显示了预测类别的热图,错误预测的图像用符号 ∗ \boldsymbol{*} 表示。预测类别名称及其softmax分数也显示在热图底部。
在这里插入图片描述

在这里插入图片描述

从图6的上半部分可以清楚地看到,AFF-ResNet-50关注的区域与标记的目标高度重叠,这表明它很好地学习了目标的定位并利用了目标区域的特征。相反,基线ResNet-50的定位能力相对较差,在许多情况下都将关注区域的中心位置放错了。虽然SENet-50能够定位真实目标,但关注区域过大,包括许多背景成分。这是因为SENet-50仅利用全局通道注意力,这偏向于全局尺度的上下文,而提出的MS-CAM还聚合了局部通道上下文,这有助于网络关注背景杂波较少的目标,并且也有利于小目标识别。在图6的下半部分,我们可以清楚地看到AFF-ResNet-50可以正确预测小尺度目标,而ResNet-50在大多数情况下都失败了。

5.2、与最先进网络的比较

为了表明通过用提出的注意力特征融合替换原始融合操作可以提高网络性能,我们将AFF和iAFF模块与其他基于相同宿主网络在不同特征融合场景下的注意力模块进行了比较。图7展示了所有网络随着网络深度逐渐增加的比较结果。可以看出:1)将SKNet/SENet/GAU-FPN与AFF-InceptionNet/AFF-ResNet/AFF-FPN进行比较,可以看出我们的AFF或iAFF集成网络在所有场景下都表现更好,这表明我们的(迭代)注意力特征融合方法不仅具有优越的性能,而且具有良好的通用性。我们相信性能的提升来自于注意力模块内部提出的多尺度通道上下文聚合。2)将基于iAFF的网络性能与基于AFF的网络进行比较,应该注意的是,所提出的迭代注意力特征融合方案可以进一步提高性能。3)通过将简单的加法或拼接替换为提出的AFF或iAFF模块,我们可以获得一个更有效的网络。例如,在图7(b)中,iAFF-ResNet (b=2) 实现了与基线ResNet(b=4)相似的性能,但所需参数仅为54%。

在这里插入图片描述

最后,我们在ImageNet上与最先进的网络验证了基于AFF/iAFF的网络性能

6、结论

我们将注意力机制的概念推广为一种选择性和动态性的特征融合方式,适用于大多数场景,包括同层、短跳跃和长跳跃连接,以及注意力机制内部的信息整合。为了解决输入特征之间的语义和尺度不一致问题,我们提出了多尺度通道注意力模块,该模块将局部通道上下文添加到全局通道统计信息中。此外,我们指出接收特征的初始整合是基于注意力的特征融合中的一个瓶颈,并且可以通过添加另一层我们称之为迭代注意力特征融合的注意力来缓解这个问题。我们进行了详细的消融研究,以经验性地验证我们提出的注意力机制的上下文感知级别、特征整合类型以及上下文聚合尺度的单个影响。在CIFAR-100和ImageNet数据集上的实验结果表明,我们的模型以更少的层或参数优于最先进的网络,这表明我们应该关注深度神经网络中的特征融合,而更复杂的特征融合注意力机制有可能持续产生更好的结果。

致谢

我们感谢编辑和匿名审稿人的宝贵意见和建议,也感谢Github上的@takedarts指出了我们CIFAR-100代码中的错误。本工作部分受中国国家自然科学基金(批准号:61573183)、国家模式识别实验室开放项目(批准号:201900029)、南京航空航天大学博士短期访问学者项目(批准号:180104DF03)、中国科协优秀中外青年交流计划和中国留学基金委(批准号:201806830039)的支持。

附录

实现细节

本工作中的所有网络架构都是基于MXNet [3] 和GluonCV [14] 实现的。由于大多数实验架构无法利用预训练权重,为了公平起见,每个实现都是从零开始训练的。我们在手稿的表2中已经介绍了大多数实验设置。在这里,在补充文档中,我们介绍了之前未提及的其余设置。
在这里插入图片描述

对于CIFAR-100数据集上的实验,权重衰减为 1 0 − 4 10^{-4} 104,我们在第300个和第350个epoch时将学习率乘以0.1。

对于ImageNet上的实验,我们使用标签平滑技巧和余弦退火学习率调度,不使用权重衰减。

对于语义分割实验,StopSign数据集是COCO数据集 [24] 的一个子集,如图8所示,它具有较大的尺度变化问题。我们使用交叉熵作为损失函数,平均交并比(mIoU)作为评估指标。
在这里插入图片描述

在这里插入图片描述

需要注意的是,表5和表6中提出的网络是使用mixup [50] 训练的。其余实验,包括所有消融研究和手稿中的图7中的实验结果,都是在不使用mixup的情况下训练的。

局部和全局融合策略
我们还研究了注意力模块内部局部和全局上下文的融合策略。我们探索了四种策略,如图9所示,其中:

  1. Half-AFF、AFF和Iterative AFF使用加法来融合局部和全局上下文,为局部和全局上下文分配相同的权重(常数0.5)。
  2. Concat-AFF将局部和全局上下文连接后接一个逐点卷积,其中融合权重在训练过程中学习并在训练后固定。
  3. Recursive AFF在推理过程中基于提出的多尺度通道注意力模块(MS-CAM)为局部和全局上下文动态分配融合权重。

表6提供了这些模块在CIFAR-100上的实验结果,从中可以看出,手稿中提出的迭代AFF(iAFF)模块达到了最佳性能。相反,能够动态为局部和全局上下文分配融合权重的Recursive AFF在这些模块中几乎是最差的。我们认为原因是Recursive AFF有两个连续的嵌套Sigmoid函数(见图9(d)),由于Sigmoid的饱和函数形式,增加了优化的难度,而手稿中提出的迭代AFF则不受此问题困扰。

AFF和Concat-AFF具有非常相似的性能。因此,为了简化,我们选择压缩和激励形式(当前MS-CAM模块)而不是Inception风格形式(Concat-AFF)用于提出的注意力特征融合。在未来的工作中,我们将在更大的数据集(如ImageNet)上研究它们的性能差异。然而,这一点并不是我们手稿中要讨论的主要问题,因此我们没有在手稿中包含这部分内容。

FLOPs分析

我们多尺度通道注意力模块内的逐点卷积会带来额外的FLOPs,但增加量很小,不是显著量级。我们的AAF-ResNet-50的FLOPs为4.3 GFlops,而我们实现中的ResNet-50的FLOPs为4.1 GFlops。实际上,根据ResNet中使用的技巧数量,ResNet-50的FLOPs可以从3.9 GFlops变化到4.3 GFlops [14]。因此,以ResNet-50与我们的AFF-ResNet-50为例,集成AFF模块仅从4.1 GFlops增加到4.3 GFlops,额外增加了 4.88 % 4.88\% 4.88%的FLOPs。考虑到AFF模块带来的性能提升,我们认为额外的 4.88 % 4.88\% 4.88% FLOPs是一个很好的权衡。

给定一个输出通道数 C C C和一个大小为 H × W H \times W H×W的输出特征图,如果输入通道数和输出通道数相同,一个 3 × 3 3 \times 3 3×3卷积层的FLOPs为 18 C 2 H W 18C^2HW 18C2HW(乘法和加法),一个ResBlock由两个或三个卷积层组成。同时,瓶颈结构中的两个逐点卷积的FLOPs为 2 r C 2 H W \frac{2}{r}C^2HW r2C2HW,其中 r = 4 r=4 r=4 r = 16 r=16 r=16取决于数据集和网络。因此,与宿主网络中的卷积FLOPs相比,AFF模块带来的FLOPs增加量是很小的。
在这里插入图片描述
在表7中,我们列出了BasicResBlock/BottleneckResBlock中的卷积FLOPs、我们AFF模块中逐点卷积的FLOPs以及相对增加百分比。可以看出,如果我们从头到尾在每个ResBlock中使用AFF模块,AFF模块带来的最大额外FLOPs百分比约为 7.7 % 7.7\% 7.7%。但是,没有必要用AFF-ResBlock替换每个ResBlock。在我们的AFF-ResNet中,我们从网络的中部(最后两个阶段)开始这种替换,同时保留原始BottleneckResBlock的前两个阶段。这进一步减少了AFF-ResNet-50的FLOPs。

总之,AFF模块会带来额外的FLOPs,但增加量很小,约为 3 % 3\% 3% 5 % 5\% 5%。我们认为这是一个很好的权衡,因为AFF模块增强了卷积网络的表示能力。在这里插入图片描述

在这里插入图片描述

import torch
import torch.nn as nn


class DAF(nn.Module):
    '''
    直接相加 DirectAddFuse
    '''

    def __init__(self):
        super(DAF, self).__init__()

    def forward(self, x, residual):
        return x + residual


class iAFF(nn.Module):
    '''
    多特征融合 iAFF
    '''

    def __init__(self, channels=64, r=4):
        super(iAFF, self).__init__()
        inter_channels = int(channels // r)

        # 本地注意力
        self.local_att = nn.Sequential(
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )

        # 全局注意力
        self.global_att = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )

        # 第二次本地注意力
        self.local_att2 = nn.Sequential(
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )
        # 第二次全局注意力
        self.global_att2 = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )

        self.sigmoid = nn.Sigmoid()

    def forward(self, x, residual):
        xa = x + residual
        xl = self.local_att(xa)
        xg = self.global_att(xa)
        xlg = xl + xg
        wei = self.sigmoid(xlg)
        xi = x * wei + residual * (1 - wei)

        xl2 = self.local_att2(xi)
        xg2 = self.global_att(xi)
        xlg2 = xl2 + xg2
        wei2 = self.sigmoid(xlg2)
        xo = x * wei2 + residual * (1 - wei2)
        return xo


class AFF(nn.Module):
    '''
    多特征融合 AFF
    '''

    def __init__(self, channels=64, r=4):
        super(AFF, self).__init__()
        inter_channels = int(channels // r)

        self.local_att = nn.Sequential(
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )

        self.global_att = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )

        self.sigmoid = nn.Sigmoid()

    def forward(self, x, residual):
        xa = x + residual
        xl = self.local_att(xa)
        xg = self.global_att(xa)
        xlg = xl + xg
        wei = self.sigmoid(xlg)

        xo = 2 * x * wei + 2 * residual * (1 - wei)
        return xo


class MS_CAM(nn.Module):
    '''
    单特征 进行通道加权,作用类似SE模块
    '''

    def __init__(self, channels=64, r=4):
        super(MS_CAM, self).__init__()
        inter_channels = int(channels // r)

        self.local_att = nn.Sequential(
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )

        self.global_att = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(channels, inter_channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(inter_channels),
            nn.ReLU(inplace=True),
            nn.Conv2d(inter_channels, channels, kernel_size=1, stride=1, padding=0),
            nn.BatchNorm2d(channels),
        )

        self.sigmoid = nn.Sigmoid()

    def forward(self, x):
        xl = self.local_att(x)
        xg = self.global_att(x)
        xlg = xl + xg
        wei = self.sigmoid(xlg)
        return x * wei

  1. 38, 49 ↩︎

  2. 12, 13 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1970073.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Mybatis】浅谈Mybatis的缓存机制,一级缓存和二级缓存

目录 1. 缓存机制介绍 2. 一级缓存 3. 二级缓存 4. mybatis缓存执行流程 1. 缓存机制介绍 MyBatis 的缓存机制是为了提高应用程序的性能而设计的,通过缓存策略来减少数据库的查询次数。MyBatis 提供了两种类型的缓存:一级缓存和二级缓存。 默认情况下…

web框架:Django进阶(二)

文章目录 Django进阶(二)1.orm1.1 基本操作1.2 连接数据库1.3 连接池1.4 多数据库1.4.1 读写分离1.4.2 分库(多个app ->多数据库)1.4.3 分库(单app)1.4.4 注意事项 1.5 表关系1.6 数据操作单表一对多正向…

IIS解析漏洞~ IIS7.漏洞分析

IIS解析漏洞 文件解析漏洞是由于中间件错误的将特殊格式的文件解析成可执行网页文件(脚本),配合文件上传漏洞进行GetShell的漏洞! 1.2:IIS7.X 在IIS7.0和IIS7.5版本下也存在解析漏洞,在默认Fast-CGI开启状况下,在一个文…

Modbus通讯协议

Modbus通讯协议 Modbus协议是一种用于电子控制器之间的通信协议,‌它允许不同类型的设备之间进行通信,‌以便进行数据交换和控制。‌Modbus协议最初为可编程逻辑控制器(‌PLC)‌通信开发,‌现已广泛应用于工业自动化领…

Error: No module factory available for dependency type: CssDependency

本篇主要用来记录VUE打包的问题点,今天使用npm run build:prod 打包VUE出现如下问题: Error: No module factory available for dependency type: CssDependency 因为测试和预发布都挺正常的,正式环境竟然出问题,废话不多说&…

用 Python 编写的井字游戏

一.介绍 在本文中,我将向您展示如何使用 Python 创建一个非常简单的井字游戏。 井字游戏是一种非常简单的双人游戏。因此每次只能有两个玩家玩。该游戏也称为井字游戏或 Xs 和 Os 游戏。一个玩家玩 X,另一个玩家玩 O。在这个游戏中,我们有一…

java+springboot+mysql疾病查询网站01548-计算机毕业设计项目选题推荐(附源码)

摘 要 随着互联网时代的到来,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛。因此,建立一个B/S结构的疾病查询网站,会使疾病查询工作系统化、规范化,也会提高医院形象,提高管理效率。 本疾病查…

最强开源模型 Llama 3.1 部署推理微调实战大全

目录 引言一、Llama 3.1简介二、Llama 3.1性能评估三、Llama 3.1模型推理实战1、环境准备2、安装依赖3、模型下载4、模型推理 四、Llama 3.1模型微调实战1、数据集准备2、导入依赖包3、读取数据集4、处理数据集5、定义模型6、Lora配置7、配置训练参数8、开始Trainer训练9、合并…

Effective Java 学习笔记--第18、19条继承与复合

目录 继承的设计 对用于继承的类可覆盖方法的说明 被继承类还需要遵循的约束 如何对继承类进行测试 如何禁止继承 复合的设计 什么是复合 复合的缺点 这两条的关系较强,核心都是继承,但是更强调继承的脆弱性,而且给出了继承的一个更优…

【云原生】Helm来管理Kubernetes集群的详细使用方法与综合应用实战

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

香港电讯亮相2024算网融合产业发展大会,荣获“SD-WAN优秀产品奖”

秉承“开放、创新、融合、共赢”的发展战略,中国通信标准化协会算网融合产业及标准推进委员会(CCSATC621)联合中国信息通信研究院,于2024年7月10日共同召开“2024年算网融合产业发展大会”。本次大会发布了多项算网融合领域最新研…

SpringBoot 日志:从基础到高级的全面指南

📚 SpringBoot 日志:从基础到高级的全面指南 🔍 📚 SpringBoot 日志:从基础到高级的全面指南 🔍摘要引言正文内容一、日志概述 📜二、日志使用 📝2.1 打印日志 📣2.2 日志…

主文件表遗失:数据恢复策略与实战指南

深入解析:无法恢复主文件表的困境 在数字化时代,数据不仅是信息的载体,更是企业运营和个人生活的核心。然而,当遭遇“无法恢复主文件表”的困境时,整个数据系统仿佛被按下了暂停键,让人措手不及。主文件表…

数据集成是什么意思?方法有哪些?数据集成三种方法介绍

1 数据集成是什么 数据集成(Data Intergration),也称为数据整合,是通过将分布式环境中的异构数据集成起来,为用户提供统一透明的数据访问方式。该定义中的集成是指从整体层面上维护数据的一致性,并提高对数据的利用和共享&#x…

智能语音转Markdown的神器

嘿,技术大咖们,今天我要给你们安利一个超酷炫的智能语音转Markdown笔记系统,它融合了前沿的语音识别技术和强大的AI大模型,绝对是记录和整理信息的神器! 打造了一个语音转Markdown的神器 智能语音生成Markdown笔记 这…

芋道源码yudao-cloud 二开日记(商品sku数据归类为规格属性)

商品的每一条规格和属性在数据库里都是单一的一条数据,从数据库里查出来后,该怎么归类为对应的规格和属性值?如下图: 在商城模块,商品的单规格、多规格、单属性、多属性功能可以说是非常完整,如下图&#x…

Java新手启航:JDK 21 版本安装,开启编程之行

在Java开发前,JDK是必不可少的环境,接下来,让我们一起完成JDK 21版本的下载和安装! 种一棵树最好的时间是10年前,其次就是现在,加油! …

【Redis 进阶】事务

Redis 的事务和 MySQL 的事务概念上是类似的,都是把一系列操作绑定成一组,让这一组能够批量执行。 一、Redis 的事务和 MySQL 事务的区别 1、MySQL 事务 原子性:把多个操作打包成一个整体。(要么全都做,要么都不做&am…

实时渲染云交互助力汽车虚拟仿真新体验!

汽车虚拟仿真是指利用软件和数学模型,模拟汽车的设计、制造、测试和运行等过程,以及汽车与环境、驾驶员、乘客等的交互。汽车虚拟仿真可以帮助汽车工程师快速验证方案,优化性能,降低成本,提高安全性和可靠性。 ​ 汽车…

S32G3系列芯片Serial Boot功能详解!

《S32G3系列芯片——Boot详解》系列——S32G3系列芯片Serial Boot功能详解!★★★ 一、Serial Boot模式概述二、串行下载协议2.1 基于UART和CAN的下载协议概述2.2 基于FlexCAN的Serial Boot2.2.1 IO配置2.2.2 时钟配置2.2.3 通信波特率2.2.4 基于FlexCAN的Serial Bo…