赞
踩
attention机制可以理解为聚焦于局部信息的机制,比如图像中的某一个图像区域。
比如群体识别:
图中除了人脸之外的信息其实都是无用的,也做不了什么任务,Attention机制便是要找到这些最有用的信息,可以想见最简单的场景就是从照片中检测人脸了。
注意力机制的本质就是定位到感兴趣的信息,抑制无用信息,结果通常都是以概率图或者概率特征向量的形式展示,从原理上来说,主要分为空间注意力模型,通道注意力模型,空间和通道混合注意力模型三种(这里不区分soft和hard attention)
空间域——将图片中的的空间域信息做对应的空间变换,从而能将关键的信息提取出来。对空间进行掩码的生成,进行打分,代表是Spatial Attention Module。
通道域——类似于给每个通道上的信号都增加一个权重,来代表该通道与关键信息的相关度的话,这个权重越大,则表示相关度越高。对通道生成掩码mask,进行打分,代表是senet, Channel Attention Module。
混合域——空间域的注意力是忽略了通道域中的信息,将每个通道中的图片特征同等处理,这种做法会将空间域变换方法局限在原始图片特征提取阶段,应用在神经网络层其他层的可解释性不强。
不是图像中所有的区域对任务的贡献都是同样重要的,只有任务相关的区域才是需要关心的,比如分类任务的主体,空间注意力模型就是寻找网络中最重要的部位进行处理。
如果网络能够对经过平移、旋转、缩放及裁剪等操作的图片得到与未经变换前相同的检测结果,我们就说这个网络具有空间变换不变性(将平移、旋转、缩放及裁剪不变性统称为空间不变性)。
提出背景: 传统CNN网络的池化层具有平移不变性(网络在平移小于池化矩阵的范围时具有平移不变性。所以只有平移小于这个范围,才能保证平移不变性。),但是CNN网络对于大尺度的空间变换并不具备不变性。Spatial Transformer Networks提出的空间网络变换层,具有平移不变性、旋转不变性及缩放不变性等强大的性能。这个网络可以加在现有的卷积网络中,提高分类的准确性。
网络结构:
STN网络包括三部分:
Localisation Network-局部网络
Parameterised Sampling Grid-参数化网格采样
Differentiable Image Sampling-差分图像采样
Localisation Network:
目的是用于生成仿射变换的参数。
输入:特征图
输出: θ \theta θ,变换矩阵(输出的规模视具体的变换操作而定)
仿射变换可以通过矩阵相乘表示
Parameterised Sampling Grid:
目的是为了得到输出特征图的坐标点对应的输入特征图的坐标点的位置。
其中, s s s代表输入特可以征图像坐标点, t t t代表输出特征图坐标点, A θ A_{\theta} Aθ是局部网络的输出。
通过这一步,可以得到变换后的输出特征图 每个位置的坐标在输入特征图 上的对应坐标点。
注:在提取像素值之前,我们应该注意到一点:目标图片的坐标点对应的输入图片的坐标点不一定是整数坐标点(例如目标图片坐标点(0,1)对应输入图片坐标点(3.2,1.3)),而仅仅整数坐标才能提取像素值,所以需要利用插值的方式来计算出对应该点的灰度值(像素值)。
可以看出,步骤一为步骤二提供了仿射变换的矩阵,步骤二为步骤三提供了输出特征图的坐标点对应的输入特征图的坐标点的位置,步骤三只需要提取这个对应的坐标点的像素值(非整数坐标需要使用双向性插值提取像素值)就能最终得到输出特征图V。
Differentiable Image Sampling
这一步完成的任务就是利用期望的插值方式来计算出对应点的灰度值。
可以约等于自动对图像的预处理操作
其中是 X X X是input, F t r F_{tr} Ftr是卷积操作, F s q ( ⋅ ) F_{sq}(·) Fsq(⋅)是压缩操作,作用是把特征图 U U U压缩成一维特征向量, F e x ( ⋅ , W ) F_{ex}(·,W) Fex(⋅,W)是激励操作,作用是给每层通道赋予权值,代表该通道的重要程度。 F s c a l e ( ⋅ , ⋅ ) F_{scale}(·,·) Fscale(⋅,⋅)代表对原始特征的重标定,即通过乘法逐通道加权到先前的特征上。
SENet的三个部分:
压缩操作,采用高的是全局平均池化(GAP,global average pooling)
激励操作,采用两个全连接层实现,第一个全连接层把 C C C个通道压缩成 C / r C/r C/r个通道(后接RELU),第二个全连接层再恢复成 C C C个通道(后接sigmoid)。 r r r是指压缩的比例,作者在尝试各种取值进行对比之后,选择 r = 16 r=16 r=16
将 Excitation 的输出的权重看做是进过特征选择后的每个特征通道的重要性,然后通过乘法逐通道加权到先前的特征上,完成在通道维度上的对原始特征的重标定。
假入原来feature map 是$ h * w * c$的,给它做一个全局池化得到 1 ∗ 1 ∗ c 1 * 1 * c 1∗1∗c的feature map,然后它再接两个全连接层(第一个全连接层神经元个数是 c / 16 c/16 c/16,相当于对 c c c进行了降维,输入是 c c c个特征,第二个全连接层神经元个数为 c c c,相当于又增维回到了 c c c个特征,这样做比直接用一个 全连接层的好处在于具有更多的非线性 ,可以更好地拟合通道间复杂的相关性,极大地减少了参数量和计算量),然后再接一个 s i g m o d sigmod sigmod层(这里采用sigmod应该是通道之间是具有相关性的,所以不能用softmax,softmax的话,最终加起来必须为1)?
from torch import nn class SELayer(nn.Module): def __init__(self, channel, reduction=16): super(SELayer, self).__init__() self.avg_pool = nn.AdaptiveAvgPool2d(1) self.fc = nn.Sequential( nn.Linear(channel, channel // reduction, bias=False), nn.ReLU(inplace=True), nn.Linear(channel // reduction, channel, bias=False), nn.Sigmoid() ) def forward(self, x): b, c, _, _ = x.size() y = self.avg_pool(x).view(b, c) y = self.fc(y).view(b, c, 1, 1) return x * y.expand_as(x)
应用案例:ResNeSt和SE-inception
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。