《Residual Attention Network for Image Classification》论文解析

不好意思上周感冒发烧了,这周继续更。

今天要介绍的是一篇attention机制的文章,在加入attention后能取得不错的效果,来自商汤CVPR2017。

首先注明版权,本文借鉴于:

知乎:https://zhuanlan.zhihu.com/p/36838135#showWechatShareTip

CSDN:https://blog.csdn.net/wspba/article/details/73727469

论文地址:Residual Attention Network for Image Classification 

Attention模型在图像分割和图像显著性检测方面的应用比较多。它的出发点是将注意力集中在部分显著或者是感兴趣的点上。本文的思想也就是利用这种attention机制,在普通的ResNet网络中,增加侧分支,侧分支通过一系列的卷积和池化操作,逐渐提取高层特征并增大模型的感受野,前面已经说过高层特征的激活对应位置能够反映attention的区域,然后再对这种具有attention特征的feature map进行上采样,使其大小回到原始feature map的大小,就将attention对应到原始图片的每一个位置上,这个feature map叫做 attention map,与原来的feature map 进行元素级别的点乘操作(element-wise product),相当于一个权重器,增强有意义的特征,抑制无意义的信息。

Contributions

  1. 提出一种可堆叠的Residual Attention Module模块,可以通过模块的堆叠使得网络达到比较深的层次。
  2. 提出一种基于Attention 的残差学习方式,因为直接进行Attention Module的堆叠会使得性能下降。
  3. 一种Bottom-up top-down的前向传播机制,即先降采样再上采样。

整篇文章的思想如下图所示:

图中红色箭头部分为trunk branch,而绿色箭头部分为mask branch,trunk branch就是普通的一个神经网络。而mask branch则是加入attention的关键所在。

那么这个mask branch是怎么工作的呢?见下图:

上图中x为输入,左边是mask branch,先下采样(down sample),让网络把较为重要的信息提取出来(attention),然后再上采样把输出和输入的大小变为一致。这时候便得到了attention map,在文中表示为M(x),而右边这条路走的Trunk branch,最终输出也是一个feature map,表示为T(x)。

得到Attention map的mask以后,一个比较naive的方法就是直接用mask和主干分支进行一个元素点乘(element-wise product)的操作,即M(x) * T(x),来对特征做一次权重操作。但是这样导致的问题就是:

M(x)的掩码是通过最后的sigmoid函数得到的,M(x)值在[0, 1]之间,连续多个Module模块直接相乘的话会导致feature map的值越来越小,同时也有可能打破原有网络的特性,使得网络的性能降低

于是就有了如下的改进:

H(x)便是下一层的输入。其实这个思想与resnet非常相似,具体可以看一看我上一篇文章:https://blog.csdn.net/wenqiwenqi123/article/details/84943259

让我们回到第一张图。三个stage,由浅到深提取不同层次的Attention信息,值得注意的是,网络中的每一个unit都可以换成目前具有非常好性能的结构,如Residual Block、Inception Block,换个角度说,就是可以将这个Attention的结构无缝连接到目前最优秀的网络中去,使得模型的性能更上一层楼。注意:stage3 中的mask Branch 上采样后没有对相同大小的feature map进行一个element-wise sum的残差连接方式,而stage1中有两个这种连接方式,stage2中有一个这种连接方式。stage3的具体网络结构见下图:

对照论文中的stage3 结构可以看到,

  1. Mask Branch和 Trunk Branch之前有一个公共的残差块。
  2. 左边是Trunk Branch,有两个Residual Blocks。
  3. 右边是mask Branch,一次残差块的下采样,一次残差块的上采样。
  4. Mask Branch上采样后经过1*1卷积和sigmoid激活,得到mask。
  5. fusion = trunk + (trunk * mask) = (1 + mask)* trunk,也就是上文中提到的残差学习方式。

下图是使用在ResNet-50上的例子,可以看出来和原始的ResNet的区别就是在每个阶段的Residual Block之间增加了Attention Module,这里有一个小trick,就是在每一个Attention Module的Soft Mask Branch中,作者使得down sample到的最小feature map的尺寸与整个网络中的最小feature map大小一致,首先7*7的feature map对于Attention来说不至于那么粗糙,作者不希望在浅层的Attention丢失的信息太多,其次也保证了它们具有相同大小的感受野。至于这么做到底能提升多大的性能,这里也很难判定。

当然作者还做了不少实验来证明他们的网络很牛逼,这里就不一一介绍了。
 


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

哎呦不错的温jay

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

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

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

打赏作者

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

抵扣说明:

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

余额充值