GCNet: Non-local Networks Meet Squeeze-Excitation Networks and Beyond

文章地址:https://arxiv.org/pdf/1904.11492.pdf
非本地网络(NLNet)通过将特定于query的全局上下文聚合到每个query位置,为捕获长期依赖关系提供了一种开创性的方法。对于图像中不同的query位置,由非局部网络建模的全局上下文几乎相同。作者利用这一发现创建了一个基于query相关公式的简化网络,它保持了NLNet的准确性,但计算量显著减少。这种简化设计与SENet具有相似的结构。因此,作者将它们统一为一个三步通用框架,用于全局上下文建模。在通用框架内,足总和设计了一个更好的实例化,称为全局上下文(GC)块,它是轻量级的,可以有效地建模全局上下文。轻量级特性允许我们将其应用于主干网络中的多个层,以构建一个全局上下文网络(GCNet),它通常在各种识别任务的主要基准上优于简化NLNet和SENet。
在这里插入图片描述
如上所示,不同查询位置的注意图几乎相同,这表明NLNet只学习了独立于查询的依赖关系。基于这一现象,作者通过对所有query positions展示使用与query-independent无关的注意图来简化query-independent。此简化块的计算量比原始非结构化块小得多,但在几个重要的视觉识别任务中,观察到的准确性几乎没有降低。此外,作者发现这个简化块与流行的挤压激励(SE)网络具有相似的结构。它们都通过从所有位置聚合的相同特征来强化原始特征,但通过聚合策略、转换和强化功能的选择来区分彼此。通过对这些功能的抽象,得到了一个统一简化NL块和SE块的三步通用框架:
(a)上下文建模模块,将所有位置的特征聚合在一起,形成一个全局上下文特征;
(b) 特征转换模块,用于捕获通道相关;
(c)融合模块,用于将全局上下文特征合并为所有位置的特征
简化NL block和SE block是这个通用框架的两个实例,但三个步骤的实现不同。但简化的 non-local block和SE block都是次优的,每个块都有一部分步骤比另一块推进。通过每一步的最佳实现组合,得到了通用框架的一个新实例,称为全局上下文(GC)块。新块在上下文建模(使用全局注意池)和融合(使用加法)步骤上与简化的NL块有相同的实现,而与SE块共享相同的转换步骤(使用两层瓶颈)。在多个视觉识别任务中,GC块的性能优于简化的non-local block和SE block。

一、实现细节

(一)、Revisiting the Non-local Block

在这里插入图片描述
Non-local Block旨在通过聚合来自其他位置的信息来增强查询位置的特征。我们将 x = x i i N p = 1 x={xi}^{N_p}_i=1 x=xiiNp=1表示为一个输入实例(例如,图像或视频)的特征映射,其中 N p N_p Np是特征映射中的位置数(例如,对于图像,Np=H·W,对于视频,Np=H·W·T)。x和z分别表示有相同的大小的Non-local Block的输入和输出:
在这里插入图片描述其中i是查询位置的索引,j枚举所有可能的位置。 f ( x i , x j ) f(x_i,x_j) fxixj表示位置i和j之间的关系,C(x)为具有归一化因子。 W z W_z Wz W v W_v Wv表示线性变换矩阵(例如1x1卷积)。为了简化,将 ω i j = f ( x i , x j ) / C ( x ) ω_{ij}=f(x_i,x_j)/C(x) ωij=fxixj/Cx表示为位置i和j之间的归一化成对关系。
为了满足实际应用中的各种需求,设计了四种具有不同 ω i j ω_{ij} ωij的Non-local Block的实例,即高斯、嵌入高斯、点积和Concat:
(a)高斯表示 ω i j ω_{ij} ωij中的f是高斯函数,定义为 ω i j = e x p ( < x i , x j > ) ∑ m e x p ( < x i , x m > ) ω_{ij}=\frac{exp(<x_i,x_j>)}{\sum_{m} exp(<x_i,x_m>)} ωij=mexp(<xi,xm>)exp(<xixj>)
(b) 嵌入高斯是高斯的一个简单扩展,它计算嵌入空间中的相似性,定义为 ω i j = e x p ( < W q x i , W k x j > ) ∑ m e x p ( < W q x i , W k x m > ) ω_{ij}=\frac{exp(<W_{qx_i},W_{kx_j}>)}{\sum_{m} exp(<W_{qx_i},W_{kx_m}>)} ωij=mexp(<WqxiWkxm>)exp<WqxiWkxj>
(c) 对于点积, ω i j ω_{ij} ωij中的f定义为点积相似性,公式为 ω i j = W q x i N p ω_{ij}=\frac{W_{qx_i}}{N_p} ωij=NpWqxi
(d) Concat的字面定义是 ω i j = R e L U ( W q [ x i , x j ] ) N p ωij=\frac{ReLU(Wq[x_i,x_j])}{N_p} ωij=NpReLUWq[xixj]。图三所示为嵌入式高斯。
Non-local Block可以被视为全局上下文模块,它将特定于查询的全局上下文特征(通过特定于查询的注意图从所有位置加权平均)聚合到每个查询位置。当为每个查询位置计算注意图时,非局部块的时间和空间复杂度都是位置数 N p N_p Np的二次方。

(二)、Simplifying the Non-local Block

基于不同查询位置的注意图几乎相同的观察结果,作者通过计算一个全局(独立于查询)注意图并为所有查询位置共享该全局注意图来简化非局部块。有 W z W_z Wz和没有 W z W_z Wz的变体都可以获得类似的性能,作者在简化版本中省略了 W z W_z Wz。定义为:

在这里插入图片描述
其中 W k W_k Wk W v W_v Wv表示线性变换矩阵。这种简化的结构如下所示:
在这里插入图片描述
为了进一步降低这个结构的计算成本,应用分布定律将 W v W_v Wv移出注意,如下所示:
在这里插入图片描述
下图显示了该结构。1x1 conv W v W_v Wv的触发器从 O ( H W C 2 ) O(HWC^2) OHWC2减少到 O ( C 2 ) O(C^2) OC2
在这里插入图片描述
与传统的Non-local Block不同,等式3中的第二项独立于查询位置i,这意味着该项在所有查询位置i中共享。因此,直接将全局上下文建模为所有位置的特征,并将全局上下文特征聚合(添加)到每个查询位置的特征。

(三)、Global Context Modeling Framework

如上图所示,简化的Non-local Block可以抽象为三个过程:
(a)全局注意,它采用1x1卷积 W k W_k Wk和softmax函数来获得注意权重,然后执行注意以获得全局上下文特征;
(b) 通过1x1卷积 W v W_v Wv进行特征变换;
(c) 特征聚合,使用加法将全局上下文特征聚合到每个位置的特征。
在这里插入图片描述

将此抽象视为一个全局上下文建模框架,如上所示,定义如下:
在这里插入图片描述
(a) ∑ j α j x j \sum_{j}\alpha_jx_j jαjxj表示上下文建模模块,该模块通过加权平均将所有位置的特征组合在一起,以获得全局上下文特征(简化NL(SNL)块中的全局注意);
(b) δ ( ⋅ ) δ(·) δ表示用于捕获通道相关性的特征变换(SNL块中的1x1 conv);
(c) F ( ⋅ , ⋅ ) F(·,·) F表示将全局上下文特征聚合到每个位置的特征的融合函数(在SNL块中按广播元素添加)。
在这里插入图片描述
SE也是文中提出的框架的一个实例。如上所示,它包括:
(a)全局上下文建模的平均池(在等式4中为 α j = 1 N P α_j=\frac{1}{N_P} αj=NP1),称为SE块中的挤压操作;
(b) 瓶颈变换模(let δ ( ⋅ ) δ(·) δ块是一个1x1卷积、一个ReLU、一个1x1卷积和一个sigmoid函数),用于计算每个通道的重要性,称为SE块中的激励操作;
(c)用于融合的重缩放函数(为$F(·,·)元素级乘法),以重新校准通道级特征。与Non-local Block不同,该SE块非常轻量级,允许它应用于所有层,只需稍微增加计算成本。

(四)、Global Context Block

作者提出了一个新的全局上下文建模框架实例,名为全局上下文(GC)块,它既有简化的Non-local Block(SNL),可以有效地对远程依赖进行建模,也有压缩激励(SE)块,可以进行轻量计算。
在简化的Non-local Block中,如下所示,transform module具有最多的参数,包括一个带有C·C参数的1x1卷积。当将该SNL块添加到更高的层(例如res5)时,该1x1卷积的参数数量C·C=2048·2048将主导该块的参数数量。为了获得SE块的轻量级特性,用瓶颈转换模块替换该1x1卷积,这将参数数量从C·C显著减少到2·C·C/r,其中r是瓶颈比率,C/r表示瓶颈的隐藏维度。默认缩减率设置为r=16时,变换模块的参数数量可以减少到原始SNL块的1/8。
在这里插入图片描述
由于两层瓶颈变换增加了优化的难度,在瓶颈变换(ReLU之前)中添加了层规范化,以简化优化,并作为一个正则化器,有利于泛化。
在这里插入图片描述
其中 α j = e W k X j ∑ m = 1 N p e W k X m α_j=\frac{e^{W_kX_j}}{\sum_{m=1}^{N_p}e^{W_kX_m}} αj=m=1NpeWkXmeWkXj是全局注意的权重, δ ( ⋅ ) = W v 2 R e L U ( L N ( W v 1 ( ⋅ ) ) δ(·)=W_{v2}ReLU(LN(W_{v1}(·)) δ=Wv2ReLULNWv1表示瓶颈转换。
GC模块包括:(a)用于上下文建模的全局注意;(b) 瓶颈转换以捕获通道依赖性;(c)用于特征融合的元素添加。

二、消融实验

在这里插入图片描述
在c4的最后一个残差块之前插入1个NL、1个SNL或1个GC。以上显示,SNL和GC在更少的参数和更少的计算量下实现了与NL相当的性能,表明原始非局部设计中的计算和参数冗余。此外,在所有残差块中添加GC块可以产生更高的性能(1.1%)↑ 在APbbox和0.9%↑ 在APmask上)时,FLOPs 和 #params略有增加。
在这里插入图片描述
NL块插入在残差块(afterAdd)之后,而SE块在残差块(after1x1)内的最后一个1x1 conv之后集成。以上显示相应的实验结果。
在这里插入图片描述
所有阶段都受益于GC块中的全局上下文建模(0.7%-1.7%↑ 在APbbox和APmask上)。插入c4和c5都比插入c3获得更好的性能,这表明更好的语义特征可以从全局上下文建模中受益更多。在FLOPs略有增加的情况下,将GC块插入所有层(c3+c4+c5)比只插入一层产生更高的性能。
在这里插入图片描述
w/o比率表示使用一个1x1 conv作为变换的简化NLNet,与baseline相比,它有更多的参数。尽管r16和r16+ReLU的参数比w/o比率变量少得多,但发现两层比单层更难优化,导致性能更差。因此,LayerNorma(LN)被用来简化优化,导致性能类似于w/o比率,但参数要少得多。
在这里插入图片描述

瓶颈设计旨在减少参数冗余,并在性能和参数之间进行权衡。如上,改变瓶颈的比率r。随着参数和FLOPs的增加,比率r降低(从32降低到4),性能持续提高(0.8%↑ 在APbbox和0.5%↑ 在APmask上),这表明瓶颈在性能和参数之间取得了很好的平衡。值得注意的是,即使比率为r=32,该网络的表现仍远远优于baseline.
在这里插入图片描述

关于poolingand fusion的不同选择见上。在融合阶段,add比scaling更有效。attention pooling的效果只比普通的average pooling略好。这表明,如何将全局上下文聚合到查询位置(选择融合模块)比如何将所有位置的特征组合在一起(选择上下文建模模块)更重要。GCNet(att+add)显著优于SENet,这是因为它有效地建模了长期依赖关系,average pooling用于上下文建模,并添加了功能聚合。
在这里插入图片描述
用ResNet-101和ResNeXt-101替换ResNet-50,向多层(c3+c4+c5)添加可变形卷积,并采用级联策略,在更强的主干上评估GCNet。GCNet在所有层(c3+c4+c5)中集成了GC块,瓶颈比率为4和16,其结果如上。

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 TensorFlow 实现的 GCNet 代码示例: ```python import tensorflow as tf def spatial_attention(x, ratio=8): # 获取输入张量的尺寸 W, H, C = x.get_shape().as_list()[1:] # 计算压缩尺寸 squeeze = tf.reduce_mean(x, axis=[1, 2], keepdims=True) # 计算空间注意力张量 excitation = tf.layers.dense(inputs=squeeze, units=C // ratio) excitation = tf.nn.relu(excitation) excitation = tf.layers.dense(inputs=excitation, units=C) excitation = tf.nn.sigmoid(excitation) # 将空间注意力张量广播到原始张量的尺寸 excitation = tf.reshape(excitation, [-1, 1, 1, C]) excitation = tf.tile(excitation, [1, W, H, 1]) # 计算加权后的特征图 return tf.multiply(x, excitation) def channel_attention(x, ratio=8): # 计算平均值和最大值特征图 avg_pool = tf.reduce_mean(x, axis=[1, 2], keepdims=True) max_pool = tf.reduce_max(x, axis=[1, 2], keepdims=True) # 计算通道注意力张量 mlp = tf.layers.dense(inputs=tf.concat([avg_pool, max_pool], axis=-1), units=C // ratio) mlp = tf.nn.relu(mlp) mlp = tf.layers.dense(inputs=mlp, units=C) mlp = tf.nn.sigmoid(mlp) # 计算加权后的特征图 return tf.multiply(x, mlp) def gc_block(x): # 计算空间注意力 x_sa = spatial_attention(x) # 计算通道注意力 x_ca = channel_attention(x) # 将两个注意力加权后相加 x = tf.add(x_sa, x_ca) # 使用 1x1 卷积进行特征压缩 x = tf.layers.conv2d(inputs=x, filters=C, kernel_size=1, strides=1, padding='same') # 应用 BN 和 ReLU 激活函数 x = tf.layers.batch_normalization(inputs=x) x = tf.nn.relu(x) # 返回输出特征图 return x ``` 以上代码实现了 GCNet 中的两种注意力机制(空间注意力和通道注意力),并使用 1x1 卷积进行特征压缩。完整的 GCNet 模型可以使用多个 GC Block 进行堆叠来实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值