当前位置:   article > 正文

Attention注意力机制及其在计算机视觉中的应用_attention+视觉

attention+视觉

参考  Attention注意力机制及其在计算机视觉中的应用 - 云+社区 - 腾讯云

目录

1、Attention机制的物理意义

2、计算机视觉中的Attention机制

3、SeNet

4、实现


1、Attention机制的物理意义

Attention机制源于对人类视觉的研究。在认知科学中,由于信息处理的瓶颈,人类会选择性的关注所有信息的一部分,同时忽略其他可见的信息。实现这一能力的原因是人类视网膜的不同部位,具有不一样的信息处理能力,即不同部分的敏锐度不同,人类视网膜中央凹部位具有最高的信息敏锐度。为了合理的利用有限的视觉信息处理资源,人类需要选择视觉区域中的特定部分,然后重点关注它。例如人们在使用电脑屏幕看电影的时候,会重点关注和处理屏幕范围内的视觉,而电脑屏幕外的视觉如键盘、电脑背景等等都会被忽略。

2、计算机视觉中的Attention机制

注意力机制最早用于自然语言处理领域,后来在计算机视觉领域也得到了广泛的应用,注意力后来被引入来视觉信息处理。注意力机制没有严格的的数学定义,例如传统的局部图像特征提取、滑动窗口方法等都可以看做一种注意力机制。在神经网络中,注意力机制通常是一个额外的神经网络,能够硬性的选择输入某些部分,或者给输入的不同部分分配不同的权重。只要是能够从大量信息中筛选出有用的信息,就能够称为注意力机制。

在神经网路中引入注意力机制有很多种方法,以卷积神经网络为例,可以在空间维度加入attention机制(如inception网络中的多尺度,让并联的卷积层有不同的权重),也可以再通道维度(channel)增加attention机制,当然也有混合维度即同时在空间维度和通道维度增加attention机制。

                                  

上图为GoogleNet的Inception v1和传统的ResNet、VGG,最大的不同主要是基于并联的多尺度结构。如果在并联的结构上引入Attention的方法可以是在蓝色模块乘以0.5的稀疏,黄色模块乘以0.3的稀疏,红色模块乘以0.2的系数,这样的话就是空间维的一种attention机制。SeNet是一种通道维的Attention,当然也可以同时在空间维和通道维使用Attention,但是带来了很大的计算量资源消耗。

3、SeNet

Squeeze-and-Excitation Network论文一共有三个图:

            

这篇论文就是通道维度增加注意力机制,关键的两个操作是squeeze和excitation,所以作者将这个attention结构命名为SE block,SE block是为了显式的实现特征通道的依赖关系,就是说通过自动学习的方式(用另外一个新的神经网络实现)获取到每个通道特征的重要程度,然后用这个重要程度去给每一个特征通道赋予一个权重值,从而让神经网络关注某些特征通道,即提升对当前任务有用的特征通道并抑制对当前任务用处不大的特征通道。

注意力的具体实现过程如上图所示。给定一个输入x,器特征通道数为C',通过一系列卷积(Ftr)等一遍变换得到一个特征通道为C的特征。与传统CNN不一样的是,接下来通过三个操作来重标定前面得到的特征。

第一个操作:Squeeze(Fsq),通过全局池化(Global Pooling),将每个通道的二维特征(HxW)压缩为一个实数,论文时通过全局平均池化的方式实现的。这属于空间维度的一种特征压缩,因为这个实数是根据所有特征值计算出来的,所以在某种程度上具有平均感受野,保持通道数不变,所以通过squeeze操作后变为1x1xC:

                                    

第二个操作:excitation(Fex),通过参数来为每个特征通道生成一个权重值,这个权重值是如何生成的就很关键了,论文是通过两个全连接层组成一个Bottleneck结构去建模通道间的相关性,并输入和输出特征数同样的权重值。

第三个操作:Scale(Fsacle),将前面得到的归一化权重加权到每个通道的特征上。论文中的方法是乘法,逐通道乘以权重系数,再完成通道上引入attention机制。

              

上图分别说明SE block是如何嵌入到主流网络(Inception和ResNet)中的,Global Pooling就是squeeze操作,FC+ReLu+FC+Sigmoid就是excitation操作,具体过程就是首先通过一个全连接层(FC),将特征维度降低到原来的1/r,然后经过ReLu激活函数再通过一个全连接层(FC)生回到原来的特征维度C,然后通过Sigmoid函数转化成一个0~1的归一化权重。这里全连接层参数随着loss不断迭代更新。

         

补充说明与思考:

(1)、论文中对比了多种分类网络加入和不加入SE block的效果,发现加入SE block的网络模型都能取得更好的分类效果。SEnet的核心思想在于通过全连接网络根据loss去自动学习权重。当然,SE block不可避免的增加了一些参数和计算量,但是在效果面前,这个性价比还是很高的。

(2)、论文认为在excitation操作中用两个圈连接层比直接用一个全链接层的好处在于:(1)、具有更多的非线性性。(2)、可以更好的拟合通道间复杂的特征。

4、源代码实现

  1. import torch.nn as nn
  2. class SELayer(nn.Module):
  3. def __init__(self, channel, reduction=16):
  4. super(SELayer, self).__init__()
  5. self.avg_pool = nn.AdaptiveAvgPool2d(1)
  6. self.fc = nn.Sequential(
  7. nn.Linear(channel, channel // reduction, bias=False),
  8. nn.ReLU(inplace=True),
  9. nn.Linear(channel // reduction, channel, bias=False),
  10. nn.Sigmoid()
  11. )
  12. def forward(self, x):
  13. b, c, _, _ = x.size()
  14. y = self.avg_pool(x).view(b, c)
  15. y = self.fc(y).view(b, c, 1, 1)
  16. return x * y.expand_as(x)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/366863
推荐阅读
相关标签
  

闽ICP备14008679号