首页 > 其他分享 >注意力模块

注意力模块

时间:2023-05-28 20:33:31浏览次数:44  
标签:Attention 特征 attention 卷积 模块 注意力 通道

注意力模块

空间注意力模块

对特征图每个位置进行attention调整,(x,y)二维调整,使模型关注到值得更多关注的区域上。

对于卷积神经网络,CNN每一层都会输出一个C x H x W的特征图,C就是通道,同时也代表卷积核的数量,亦为特征的数量,H 和W就是原始图片经过压缩后的图的高度和宽度,而空间注意力就是对于所有的通道,在二维平面上,对H x W尺寸的特征图学习到一个权重矩阵,对应每个像素都会学习到一个权重。而这些权重代表的就是某个空间位置信息的重要程度 ,将该空间注意力矩阵附加在原来的特征图上,增大有用的特征,弱化无用特征,从而起到特征筛选和增强的效果。代表的Self-Attention、Non-local Attention以及Spatial Transformer等。

自注意力:Self-Attention

自注意力的结构下图所示,保留了Query, Key和Value等名称。对应图中自上而下分的三个分支,计算时通常分为三步:

(1) 第一步是将query和每个key进行相似度计算得到权重,常用的相似度函数有点积,拼接,感知机等;

(2) 第二步一般是使用一个softmax函数对这些权重进行归一化,转换为注意力;

(3) 第三步将权重和相应的键值value进行加权求和得到最后的attention。

img

自注意力是基于特征图本身的关注而提取的注意力。对于卷积而言,卷积核的设置限制了感受野的大小,导致网络往往需要多层的堆叠才能关注到整个特征图。而自注意的优势就是它的关注是全局的,它能通过简单的查询与赋值就能获取到特征图的全局空间信息。

** 非局部注意力:**Non-local Attention

Non-local Attention是研究self-attention在CV领域应用非常重要的文章。主要思想也很简单,CNN中的卷积单元每次只关注邻域kernel size 的区域,就算后期感受野越来越大,终究还是局部区域的运算,这样就忽略了全局其他片区(比如很远的像素)对当前区域的贡献。所以Non-local blocks 要做的是,捕获这种long-range 关系:对于2D图像,就是图像中任何像素对当前像素的关系权值;对于3D视频,就是所有帧中的所有像素,对当前帧的像素的关系权值。

img

论文中有谈及多种实现方式,在这里简单说说在深度学习框架中最好实现的Matmul 方式,如上所示:

(1) 首先对输入的feature map X 进行线性映射(说白了就是111 卷积,来压缩通道数),然后得到θ,Φ,g特征;

(2) 通过reshape操作,强行合并上述的三个特征除通道数外的维度,然后对θ,Φ进行矩阵点乘操作,得到类似协方差矩阵的东西(这个过程很重要,计算出特征中的自相关性,即得到每帧中每个像素对其他所有帧所有像素的关系);

(3) 然后对自相关特征以列或以行(具体看矩阵g 的形式而定) 进行Softmax 操作,得到0~1的权重,这里就是我们需要的Self-attention 系数;

(4) 最后将attention系数,对应乘回特征矩阵g 中,然后再与原输入的特征图残差一下,获得non-local block的输出。

通道注意力模块

分配各个卷积通道上的资源,z轴的单维度调整。

不同与空间注意力,通道域注意力类似于给每个通道上的特征图都施加一个权重,来代表该通道与关键信息的相关度的话,这个权重越大,则表示相关度越高。在神经网络中,越高的维度特征图尺寸越小,通道数越多,通道就代表了整个图像的特征信息。如此多的通道信息,对于神经网络来说,要甄别筛选有用的通道信息是很难的,这时如果用一个通道注意力告诉该网络哪些是重要的,往往能起到很好的效果,这时CV领域做通道注意力往往比空间好的一个原因。代表的是SENet、SKNet、ECANet等。

SENet

如果说Self-Attention是NLP领域的神,那么SE注意力就是CV领域的真神。如果你想为你的网络提高精度,那么SE注意力是一个很好的选择。SE注意力在CV领域有很强的普适性,任何网络添加上SE注意力基本都能有一定提升。

img

上图是SENet的模型结构,该注意力机制主要分为三个部分:挤压(squeeze),激励(excitation),以及注意(scale )。

首先是 Squeeze 操作,从空间维度来进行特征压缩,将hwc的特征变成一个11c的特征,得到向量某种程度上具有全域性的感受野,并且输出的通道数和输入的特征通道数相匹配,它表示在特征通道上响应的全域性分布。算法很简单,就是一个全局平均池化。

其次是 Excitation 操作,通过引入 w 参数来为每个特征通道生成权重,其中 w 就是一个多层感知器,是可学习的,中间经过一个降维,减少参数量。并通过一个 Sigmoid 函数获得 0~1 之间归一化的权重,完成显式地建模特征通道间的相关性。

最后是一个 Scale 的操作,将 Excitation 的输出的权重看做是经过选择后的每个特征通道的重要性,通过通道宽度相乘加权到先前的特征上,完成在通道维度上的对原始特征的重标定。

**** SKNet

SKNet是基于SENet的改进,他的思路是在提高精度。而很多网络使用了各种Trick来降低计算量,比如SENet多层感知机间添加了降维。SKNet就是想如果不牺牲那么多计算量,能否精度提高一些呢?因此它设置了一组动态卷积选择来实现精度提升。

img

上图所示是SKNet的基本结构。主要创新点是设置了一组动态选择的卷积,分为三个部分操作Split、Fuse、Select。

(1)Split:对输入向量X进行不同卷积核大小的完整卷积操作(组卷积),特别地,为了进一步提升效率,将5x5的传统卷积替代为dilation=2,卷积核为3x3的空洞卷积;

(2)Fuse:类似SE模块的处理,两个feature map相加后,进行全局平均池化操作,全连接先降维再升维的为两层全连接层,输出的两个注意力系数向量a和b,其中a+b=1;

(3)Select:Select操作对应于SE模块中的Scale。Select使用a和b两个权重矩阵对之前的两个feature map进行加权操作,它们之间有一个类似于特征挑选的操作。

混合域注意力方法

除了前面两章提到的空间域和通道域注意力,在CV领域应用更广的还有它们之间的结合,即空间与通道结合的混合域注意力机制。思想也是很简单,通道和空间对网络都有提升作用,那么它们间的有效结合必定会给网络带来更大的促进作用。根据DL任务的不同,它们结合方式也存在区别,有代表性的是CBAM、DANet、CCNet、Residual Attention等

CBAM

CBAM来自于 ECCV2018的文章Convolutional Block Attention Module,是如今CV领域注意力食物链顶端的存在。它也是基于SENet的改进,具体来说,论文中把 channel-wise attention 看成是教网络 Look ‘what’;而spatial attention 看成是教网络 Look ‘where’,所以它比 SE Module 的主要优势就多了后者。

img

上图所示是CBAM的基本结构,前面是一个使用SENet的通道注意力模块,后面的空间注意力模块设计也参考了SENet,它将全局平均池化用在了通道上,因此作用后就得到了一个二维的空间注意力系数矩阵。值得注意的是,CBAM在空间与通道上同时做全局平均和全局最大的混合pooling,能够提取到更多的有效信息。

DANet

DANet来自于CVPR 2019的文章Dual Attention Network for Scene Segmentation,注意思想也是参考了上述提到的CBAM 和Non-local 的融合变形。具体来说就是,结构框架使用的是CBAM,具体方法使用的是self-attention。

img

上图所示是DANet注意力模块的基本结构,主要包括Position Attention Module 和 Channel Attention Module。两个模块使用的方法都是self-attention,只是作用的位置不同,一个是空间域的self-attention,一个是通道域的self-attention。这样做的好处是:在CBAM 分别进行空间和通道self-attention的思想上,直接使用了non-local 的自相关矩阵Matmul 的形式进行运算,避免了CBAM 手工设计pooling,多层感知器等复杂操作。同时,把Self-attention的思想用在图像分割,可通过long-range上下文关系更好地做到精准分割。

标签:Attention,特征,attention,卷积,模块,注意力,通道
From: https://www.cnblogs.com/wjmk/p/17438800.html

相关文章

  • ESP8266WiFi模块与Android实现数据通信
    ESP8266模块三种模式:    1、STA模式(客户端模式):ESP8266模块通过路由器连接互联网,手机或电脑通过互联网实现对设备的远程控制    2、AP模式(接入点模式):ESP8266模块作为热点,手机或电脑直接与模块连接,实现局域网无线控制    3、STA+AP模式(两种模式并存):ESP826......
  • CentOS 9 安装 Nginx 模块 `subs_filter`
    sub_filter和subs_filter区别sub_filter(0.7.24):替换响应体(ResponseBody)中的文本,只能设置一组替换。subs_filter:替换响应体(ResponseBody)和响应头(ResponseHeaders)中的文本,可以设置多组替换。sub_filter使用案例:http{server{listen80;server_n......
  • CentOS 9 安装 Nginx 模块 `subs_filter`
    sub_filter和subs_filter区别sub_filter(0.7.24):替换响应体(ResponseBody)中的文本,只能设置一组替换。subs_filter:替换响应体(ResponseBody)和响应头(ResponseHeaders)中的文本,可以设置多组替换。sub_filter使用案例:http{server{listen80;server_......
  • IDEA中创建java多模块项目和打包
    文章来源:https://www.jb51.net/article/210892.htm#_label7   非常感谢。一、使用springinitializr创建java工程1、启动IDEA,新建java工程,使用向导创建一个springboot框架的工程 2.设置项目信息,java版本选择8 3、勾选项目需要用到的依赖 4、设置项目名称,点击......
  • OverTheWire攻关过程-Bandit模块29
    我们打开lv28-lv29,查看信息机器翻译有一个git仓库在ssh://bandit28-git@localhost/home/bandit28-git/repo经由端口2220。用户bandit28-git的密码与用户bandit28的密码相同。克隆存储库并找到下一级别的密码。您可能需要解决此级别的命令git的我们登陆服务器没有文件git拉取到本......
  • BBP002面包板电源模块如何使用(A版)
    今天我们介绍一款比较好用的面包板电源模块BBP002,该款面包板电源模块具有升压稳压功能,只需一根type-c线就可以解决面包板不同电压输出的问题。该模块的型号为BBP002,某宝搜一下BBP002能找到。模块采用一输入三输出的模式,一输入指根据使用功率不同采用不同的输入方式,对于小功率......
  • Ubuntu 下创建cmake的qt工程,使用CTK widget模块(cmake 工程配置)
    一、先看 二、假设已经编译好ctk库,对cmakelists.txt进行设置(解决:找不到头文件、未定义啥的错误) 三、目录结构 ......
  • os 模块
     #路径表示:“D:/test”r“D:\test”“D://test”#导入importos#获取当前的工作路径os.getcwd()#传入任意一个path路径,返回的是该路径下所有文件和目录组成的列表path=r“D:\test”os.listdir(path)#传入任意一个path路径,深层次遍历指定路径下的所有文件夹,返回的......
  • MT8192,MT8195 全网通安卓核心板智能模块
    MT8192和MT8195核心板是功能强大的芯片,非常适合生产力、视频会议、远程教育、游戏或娱乐流媒体等领域。这两款芯片采用了八核CPU设计,因此性能有望显着提升:MT8192选择高性能ArmCortex-A76CPU,而MT8195使用最新的ArmCortex-A78CPU。这些技术让MT8192和MT8195成为了具有强大......
  • 基于可穿戴的GPS定位存储模块方案特色解析
    前记 GPS作为一个位置定位手段,在日常生活中扮演着非常重要的角色。在研发动物可穿戴产品的同时。团队一直在做产品和模块标准化的事情,尽量把研发出来的东西标准化。按照任老板的说法,在追求理想主义的路上,不断孵化现实主义的产品与解决方案,攀登珠峰的征途中沿途下蛋。笔者非常赞......