【文献阅读】A2-Nets: Double Attention Networks

原文链接:https://arxiv.org/abs/1810.11579


学习捕获长距离关系是图像/视频识别的基础。现有的CNN模型一般依赖于增加深度来对这种关系进行建模,效率非常低。作者提出了“双注意力块”,这是一种新的组件,它从输入图像/视频的整个时空空间中聚集和传播信息的全局特征,使后续的卷积层能够有效地从整个空间访问特征。该组件设计为两步双注意机制,第一步通过二级注意池将整个空间的特征集合成一个紧凑的集合,第二步通过另一个注意力自适应地选择和分配特征到每个位置。

CNN天生就受到卷积运算的限制,卷积运算致力于捕获局部特征和关系,并且在建模长距离相互依赖关系方面效率低下。虽然叠加多个卷积算子可以扩大接受域,但在实践中也存在一些不利的问题。

  1. 将多个操作符叠加在一起,使得模型变得不必要的深和大,导致更高的计算和内存成本,增加了过度拟合的风险;
  2. 远离特定位置的特征在影响正向传播和反向传播的位置之前,都要经过一层堆栈,增加了训练过程中的优化难度;
  3. 远处可见的特征实际上是后面几层的“延迟”的,导致了低效的推理。

作者提出的A2-Net的核心思想是首先将整个空间的关键特征收集到一个紧凑的集合中,然后自适应地将其分布到每个位置,这样后续的卷积层即使没有很大的接收域也可以感知整个空间的特征。
第一级的注意力集中操作有选择地从整个空间中收集关键特征,而第二级的注意力集中操作采用另一种注意力机制,自适应地分配关键特征的子集,这些特征有助于补充高级任务的每个时空位置。

A2-Net与SENet协方差池化Non-localTransformer有点类似,但是不同点在于它的第一个注意力操作隐式地计算池化特征的二阶统计,并能捕获SENet中使用的全局平均池化无法捕获的复杂外观和运动相关性;它的第二注意力操作从一个紧凑的袋子中自适应地分配特征,这比 Non-localTransformer中将所有位置的特征与每个特定位置进行穷举关联更有效。

主要贡献如下

  1. 提出了一个通用的公式,通过通用的收集和分布函数来捕获长期的特征相关性
  2. 提出了一种用于收集和分布长距离特征的双注意块,它是一种有效的二次特征统计和自适应特征分配的体系结构。该块可以用较低的计算和内存占用来建模长期的相互依赖关系,同时显著提高图像/视频识别性能
  3. 通过广泛的消融研究来调查提出的A2-Net的影响,并通过与当前技术水平的比较来证明它在图像识别和视频动作识别任务的一些公共基准上的优越性能

方法

X ∈ R c × h × w X\in \mathbb{R}^{c \times h \times w} XRc×h×w为输入,每个位置 i = 1 , ⋯   , h w i=1, \cdots,hw i=1,,hw的特征为 v i v_i vi,定义
z i = F d i s t r ( G g a t h e r ( X ) , v i ) z_i=F_{distr}(G_{gather}(X),v_i) zi=Fdistr(Ggather(X),vi)
为输出:首先收集整个空间的特征,然后将其分配回每个输入位置 i i i,同时考虑该位置的局部特征 v i v_i vi

这种先 g a t h e r i n g gathering gathering d i s t r i b u t i n g distributing distributing的想法源于SENet,而SENet在收集过程中使用 g l o b a l   a v e r a g e   p o o l i n g global \space average \space pooling global average pooling而产生的单个全局特性被分发到所有位置,忽略了位置之间的不同需求。
A2-Net中,更复杂的全局关系可以被一组紧凑的特征所捕获,每个位置可以接收其自定义的全局信息,这些信息与现有的局部特征相辅相成,有助于学习更复杂的关系。
在这里插入图片描述

Feature Gathering

与只计算一阶统计量的传统平均池化和最大池化相比,双线性池化能更好地捕捉和保持复杂关系。
双线性池化就是将两张输入特征图 A A A B B B里的特征向量对 ( a i , b i ) (a_i,b_i) (ai,bi)做外积并相加
G b i l i n e a r ( A , B ) = A B T = ∑ ∀ i a i b i T G_{bilinear}(A,B)=AB^T=\sum_{\forall i}a_i b_i^T Gbilinear(A,B)=ABT=iaibiT
其中, A = [ a 1 , ⋯   , a h w ] ∈ R m × h w A=[a_1,\cdots,a_{hw}] \in \mathbb{R}^{m \times hw} A=[a1,,ahw]Rm×hw B = [ b 1 , ⋯   , b h w ] ∈ R n × h w B=[b_1,\cdots,b_{hw}] \in \mathbb{R}^{n \times hw} B=[b1,,bhw]Rn×hw。在CNNs中, A A A B B B可以是同层出来的特征图 A = B A=B A=B;也可以是两个不同层出来的特征图 A = ϕ ( X ; W ϕ ) A=\phi(X;W_{\phi}) A=ϕ(X;Wϕ) B = θ ( X ; W θ ) B=\theta(X;W_{\theta}) B=θ(X;Wθ) W ϕ W_{\phi} Wϕ W θ W_{\theta} Wθ是参数。

通过引入输出变量 G = [ g 1 , ⋯   , g n ] ∈ R m × n G=[g_1,\cdots,g_n]\in \mathbb{R}^{m \times n} G=[g1,,gn]Rm×n并且重写第二个特征 B = [ b ˉ 1 , ⋯   , b ˉ n ] B=[\bar{b}_1,\cdots,\bar{b}_n] B=[bˉ1,,bˉn] b ˉ i \bar{b}_i bˉi是一个 h w hw hw维的行向量,输出为
g i = A b ˉ i T = ∑ ∀ j b ˉ i j a j g_i=A \bar{b}_i^T=\sum_{\forall j}\bar{b}_{ij}a_j gi=AbˉiT=jbˉijaj
上述公式不仅是计算二阶统计量,输出 G G G实际上是一个视觉基元包,每个基元 g i g_i gi是通过收集局部特征用 b ˉ i \bar{b}_i bˉi加权得到的; j j j为特征图上的位置; i i i为不同的 A t t e n t i o n   M a p s Attention \space Maps Attention Maps

进一步将 s o f t m a x softmax softmax应用于 B B B ∑ j b ˉ i j = 1 \sum_j \bar{b}_{ij}=1 jbˉij=1,可得到二阶注意力池化过程为
g i = A   s o f t m a x ( b ˉ i ) T g_i=A \space softmax(\bar{b}_i)^T gi=A softmax(bˉi)T
A = ϕ ( X ; W ϕ ) A=\phi(X;W_{\phi}) A=ϕ(X;Wϕ) B = s o f t m a x ( θ ( X ; W θ ) ) B=softmax(\theta(X;W_{\theta})) B=softmax(θ(X;Wθ)) X X X为输入的特征图。

Feature Distribution

从整个空间中收集特征后的下一步是将它们分布到输入的每个位置,这样即使使用很小的卷积核,后续的卷积层也可以感知全局信息。
不像SENet那样将相同的全局特性分布到所有的位置,而是在每个位置上根据特征 v i v_i vi的需要分布一个自适应的视觉基元包来获得更大的灵活性。
这是通过 s o f t   a t t e n t i o n soft \space attention soft attention G g a t h e r ( X ) G_{gather}(X) Ggather(X)中选择一个特征向量子集来实现的
z i = ∑ ∀ j v i j g j = G g a t h e r ( X ) v i ,   w h e r e   ∑ ∀ j v i j = 1 z_i=\sum_{\forall j}v_{ij}g_j=G_{gather}(X)v_i,\space where \space \sum_{\forall j}v_{ij}=1 zi=jvijgj=Ggather(X)vi, where jvij=1
V = s o f t m a x ( ρ ( X ; W ρ ) ) V=softmax(\rho(X;W_{\rho})) V=softmax(ρ(X;Wρ)),其中 W ρ W_{\rho} Wρ为参数。

The Double Attention Block

将上面两个注意步骤结合起来,形成双注意块里模块
Z = F d i s t r ( G g a t h e r ( X ) , V ) = G g a t h e r ( X ) s o f t m a x ( ρ ( X ; W ρ ) ) = [ ϕ ( X ; W ϕ ) s o f t m a x ( θ ( X ; W θ ) ) T ] s o f t m a x ( ρ ( X ; W ρ ) ) \begin{aligned} Z & =F_{distr}(G_{gather}(X), V) \\ & = G_{gather}(X)softmax(\rho(X;W_{\rho})) \\ & = [\phi(X;W_{\phi})softmax(\theta(X;W_{\theta}))^T]softmax(\rho(X;W_{\rho})) \end{aligned} Z=Fdistr(Ggather(X),V)=Ggather(X)softmax(ρ(X;Wρ))=[ϕ(X;Wϕ)softmax(θ(X;Wθ))T]softmax(ρ(X;Wρ))
在这里插入图片描述

DoubleAttentionLayer是一种注意力机制的网络层,可以用于图像分类、目标检测等任务中。在PyTorch中,可以通过如下代码实现DoubleAttentionLayer: ```python import torch import torch.nn as nn class DoubleAttentionLayer(nn.Module): def __init__(self, in_channels, reduction_ratio=16): super(DoubleAttentionLayer, self).__init__() self.in_channels = in_channels self.reduction_ratio = reduction_ratio self.conv1 = nn.Conv2d(in_channels, in_channels // reduction_ratio, kernel_size=1) self.conv2 = nn.Conv2d(in_channels, in_channels // reduction_ratio, kernel_size=1) self.conv3 = nn.Conv2d(in_channels, in_channels, kernel_size=1) self.softmax = nn.Softmax(dim=-1) def forward(self, x): # Channel Attention avg_pool = torch.mean(x, dim=(-2,-1), keepdim=True) max_pool, _ = torch.max(x, dim=(-2,-1), keepdim=True) ca = torch.cat([self.conv1(avg_pool), self.conv2(max_pool)], dim=1) ca = self.softmax(ca) x = x * ca # Spatial Attention sa = self.conv3(x) sa = self.softmax(sa) x = x * sa return x ``` 在上述代码中,`in_channels`表示输入张量的通道数,`reduction_ratio`表示通道注意力机制中的缩放比例。在`__init__`函数中,我们首先定义了三个卷积层,分别用于计算通道注意力机制中的平均值、最大值以及空间注意力机制。在`forward`函数中,我们首先计算通道注意力机制的权重,并将其应用于输入张量。然后,我们计算空间注意力机制的权重,并将其应用于经过通道注意力机制处理后的张量。最后,我们返回处理后的张量。 需要注意的是,这里的`x`张量的维度应该为`[batch_size, in_channels, height, width]`。如果您的输入张量不符合这个要求,您需要先进行相应的调整。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值