目录

1.什么是注意力机制

1.1  Encoder-Decoder框架(编码-解码框架)

1.2 注意力的基础模型

2 空间注意力模型

2.1 什么是空间注意力模型

2.2 典型的空间注意力模型

3  通道注意力机制

3.1 什么是通道注意力

3.2 通道注意力机制典型网络

4 空间和通道混合注意力机制

5,总结


1.什么是注意力机制

当我们人类在看东西时,一般会将注意力集中注视着某个地方,而不会关注全部所有信息。例如当我们一看到下面这张猫的图片时,主要会将目光停留在猫的脸部,以及留意猫的躯干,而后面的草地则会被当成背景忽略掉,也就是说我们在每一处空间位置上的注意力分布是不一样的。如下图,当需要识别的是猫咪的时候,其他绿色本经特征就是无用的。attention机制就是找到这些最有用的信息。深度学习中的注意力机制(Attention Mechanism)和人类视觉的注意力机制类似,就是在众多信息中把注意力集中放在重要的点上,选出关键信息,而忽略其他不重要的信息

     不是所有的区域对任务的贡献都是相同的,只有任务相关的区域才需要关心,如分类任务主体,注意力机制就是寻找网络中最重要的部分进行处理,它可以集成到网络结构中以提高模型的性能。一般来说,注意力机制可以从图像空间和通道空间两个维度进行设计。可以分为空间注意力机制,通道注意力机制还有空间和通道混合注意力模型三种

根据处理图像的像素还是区域,Attention又可以分类为两种,主要SA和CA:

soft attention(包括空间注意力、通道注意力)软注意学习的目的是选择细粒度的重要像素点,它们是pixel级。
hard attention( local 注意力) 硬注意学习则致力于搜索粗糙的潜在判别区域,它们是region级。

注意力机制讲的比较全面的三个文章的链接为以下两个:

从频域角度重新思考注意力机制——FcaNet

Attention机制理解笔记(空间注意力+通道注意力+CBAM+BAM)_落了一地秋的博客-CSDN博客_空间通道注意力机制

注意力机制BAM和CBAM详细解析(附代码)_Wenrui Xie的博客-CSDN博客_空间注意力代码

目前大多数的注意力模型附着在Encoder-Decoder框架下,所以我们先来了解Encoder-Decoder框架然后在该框架下,了解注意力模型。

1.1  Encoder-Decoder框架(编码-解码框架)

目前大多数的注意力模型附着在Encoder-Decoder框架下,所以我们先来了解下这个框架。Encoder-Decoder框架可以看作是一种文本处理领域的研究模式,该框架的抽象表示如下图:

给定输入X,通过Encoder-Decoder框架生成目标Y。其中,Encoder(编码器)就是对输入X进行编码,通过非线性变换转化为中间语义表示C;Decoder(解码器),根据输入X的语义表示C和之前已生成的历史信息生成目标信息。
      Encoder-Decoder框架是个通用框架,有很多的场景,在文本处理、图像处理、语音识别等各领域经常使用,Encoder、Decoder可使用各种模型组合,例如CNN/RNN/BiRNN/LSTM等。例如对于自动问答,X是一个问句,Y是答案;对于机器翻译,X是一种语言,Y是另外一种语言;对于自动摘要,X是一篇文章,Y是摘要;对于图片描述,X是一张图片,Y是图片的文字描述内容……

1.2 注意力的基础模型

本文开头讲到的人类视觉注意力机制,它在处理信息时注意力的分布是不一样的。而Encoder-Decoder框架将输入X都编码转化为语义表示C,这样就会导致所有输入的处理权重都一样,没有体现出注意力集中,因此,也可看成是“分心模型”。
为了能体现注意力机制,将语义表示C进行扩展,用不同的C来表示不同注意力的集中程度,每个C的权重不一样。那么扩展后的Encoder-Decoder框架变为:

例如输入的英文句子是:Tom chase Jerry,目标的翻译结果是“汤姆追逐杰瑞”。那么在语言翻译中,Tom, chase, Jerry这三个词对翻译结果的影响程度是不同的,其中,Tom, Jerry是主语、宾语,是两个人名,chase是谓语,是动作,那么这三个词的影响程度大小顺序分别是Jerry>Tom>chase,例如(Tom,0.3)(Chase,0.2) (Jerry,0.5),不同的影响程度代表AI模型在翻译时分配给不同单词的注意力大小,即分配的概率大小。

下图描述(Image-Caption)是一种典型的图文结合的深度学习应用,输入一张图片,人工智能系统输出一句描述句子,语义等价地描述图片所示内容。很明显这种应用场景也可以使用Encoder-Decoder框架来解决任务目标,此时Encoder输入部分是一张图片,一般会用CNN来对图片进行特征抽取,Decoder部分使用RNN或者LSTM来输出自然语言句子。

2 空间注意力模型

2.1 什么是空间注意力模型

一般来说对于同一像素点不同通道求均值(NxCxHxW---->Nx1xHxW),再经过一些卷积和上采样的运算得到spitial attention mask,空间特征每层的像素点就被赋予不同的权重(一句话来说这是针对 N C H W 的每个C 的 H W 的赋予权重,这就叫做spitial attention(空间注意))。

举例说明:如下图


     空间注意力是对64个通道进行mean的一个操作,得到一个(w x h)的权重,mean的操作就学到了所有通道的整体分布,而抛弃了奇异的通道。比如说1,2的图可以很好的描绘出马的形状,而3,4就不行(但本质上它也是要显示出马的形状),但是通过mean后,得到的w x h权值共享后,给了3,4一定的权值描述,相当于给3,4一定的注意力,这样它们也可以描绘出马的形状。

2.2 典型的空间注意力模型

1)STN(空间变换网络)

 STN是什么(What)

  1. STN对feature map(包括输入图像)进行空间变换,输出一张新的图像。
  2. 我们希望STN对feature map进行变换后能把图像纠正到成理想的图像,然后丢进NN去识别,举例来说,如下图所示,输入模型的图像可能是摆着各种姿势,摆在不同位置的凉宫春日,我们希望STN把它纠正到图像的正中央,放大,占满整个屏幕,然后再丢进CNN去识别。
  3. 这个网络可以作为单独的模块,可以在CNN的任何地方插入,所以STN的输入不止是输入图像,可以是CNN中间层的feature map

STN是一个非常典型的空间注意力模型,通过学习输入的形变来完成适合任务的预处理。其结构如下图所示,对于其详细的工作原理,可以参考博文:

https://blog.csdn.net/YOULANSHENGMENG/article/details/121222429

 2)Dynamic Capacity Network

3  通道注意力机制

3.1 什么是通道注意力

一句话来说就是== 针对 N C H W 的 每个 C 赋予权重,这就叫做 channel atteion== (N C H W----> N C 1 1),例如下图中的例子:


就是对于每个channel赋予不同的权重,比如1,2处马的形状比较明显,所以理所当然,对1,2通道的权重比较大,3,4处权重小。

如何得到该图像的方法,转自以下博文pytorch实现特征图可视化,代码简洁,包教包会_Mr_DaYang的博客-CSDN博客_pytorch特征图可视化

技术要点 1.选择一层网络,将图片的tensor放进去 2.将网络的输出plt.imshow,使用的时候更改图像的路径即可。

import torch
from torchvision import models, transforms
from PIL import Image
import matplotlib.pyplot as plt
import numpy as np
import scipy.misc
plt.rcParams['font.sans-serif']=['STSong']
import torchvision.models as models
model = models.alexnet(pretrained=True)#1.模型查看
# print(model)#可以看出网络一共有3层,两个Sequential()+avgpool
# model_features = list(model.children())
# print(model_features[0][3])#取第0层Sequential()中的第四层
# for index,layer in enumerate(model_features[0]):
#     print(layer)#2. 导入数据
# 以RGB格式打开图像
# Pytorch DataLoader就是使用PIL所读取的图像格式
# 建议就用这种方法读取图像,当读入灰度图像时convert('')
def get_image_info(image_dir):image_info = Image.open(image_dir).convert('RGB')#是一幅图片# 数据预处理方法image_transform = transforms.Compose([transforms.Resize(256),transforms.CenterCrop(224),transforms.ToTensor(),transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])])image_info = image_transform(image_info)#torch.Size([3, 224, 224])image_info = image_info.unsqueeze(0)#torch.Size([1, 3, 224, 224])因为model的输入要求是4维,所以变成4维return image_info#变成tensor数据#2. 获取第k层的特征图
'''
args:
k:定义提取第几层的feature map
x:图片的tensor
model_layer:是一个Sequential()特征层
'''
def get_k_layer_feature_map(model_layer, k, x):with torch.no_grad():for index, layer in enumerate(model_layer):#model的第一个Sequential()是有多层,所以遍历x = layer(x)#torch.Size([1, 64, 55, 55])生成了64个通道if k == index:return x#  可视化特征图
def show_feature_map(feature_map):#feature_map=torch.Size([1, 64, 55, 55]),feature_map[0].shape=torch.Size([64, 55, 55])# feature_map[2].shape     out of boundsfeature_map = feature_map.squeeze(0)#压缩成torch.Size([64, 55, 55])#以下4行,通过双线性插值的方式改变保存图像的大小feature_map =feature_map.view(1,feature_map.shape[0],feature_map.shape[1],feature_map.shape[2])#(1,64,55,55)upsample = torch.nn.UpsamplingBilinear2d(size=(256,256))#这里进行调整大小feature_map = upsample(feature_map)feature_map = feature_map.view(feature_map.shape[1],feature_map.shape[2],feature_map.shape[3])feature_map_num = feature_map.shape[0]#返回通道数row_num = np.ceil(np.sqrt(feature_map_num))#8plt.figure()for index in range(1, feature_map_num + 1):#通过遍历的方式,将64个通道的tensor拿出plt.subplot(row_num, row_num, index)plt.imshow(feature_map[index - 1], cmap='gray')#feature_map[0].shape=torch.Size([55, 55])#将上行代码替换成,可显示彩色 plt.imshow(transforms.ToPILImage()(feature_map[index - 1]))#feature_map[0].shape=torch.Size([55, 55])plt.axis('off')scipy.misc.imsave( 'feature_map_save//'+str(index) + ".png", feature_map[index - 1])plt.show()if __name__ ==  '__main__':image_dir = r"car_logol.png"# 定义提取第几层的feature mapk = 0image_info = get_image_info(image_dir)model = models.alexnet(pretrained=True)model_layer= list(model.children())model_layer=model_layer[0]#这里选择model的第一个Sequential()feature_map = get_k_layer_feature_map(model_layer, k, image_info)show_feature_map(feature_map)

如果需要彩色显示:

直接看70行注释
#在show_feature_map函数中加上一句,tensor数据变成Img的操作
image_PIL=transforms.ToPILImage()(feature_map[index - 1])

3.2 通道注意力机制典型网络

1)SENet( Squeeze-and-Excitation Networks)

SENet以极大的优势获得了最后一届 ImageNet 2017 竞赛 Image Classification 任务的冠军,考虑特征通道之间的关系, SENet就是基于这一点并提出了 Squeeze-and-Excitation Networks(简称 SENet)。 SENet的结构中,Squeeze 和 Excitation 是两个非常关键的操作,以此来命名。我们的动机是希望显式地建模特征通道之间的相互依赖关系。另外, SENet并不打算引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的「特征重标定」策略。具体来说,就是通过学习的方式来自动获取到每个特征通道的重要程度,然后依照这个重要程度去提升有用的特征并抑制对当前任务用处不大的特征。

上图是 SE 模块的示意图。给定一个输入 x,其特征通道数为 c_1,通过一系列卷积等一般变换后得到一个特征通道数为 c_2 的特征。与传统的 CNN 不一样的是,接下来我们通过三个操作来重标定前面得到的特征。

首先是 Squeeze 操作,我们顺着空间维度来进行特征压缩,将每个二维的特征通道变成一个实数,这个实数某种程度上具有全局的感受野,并且输出的维度和输入的特征通道数相匹配。它表征着在特征通道上响应的全局分布,而且使得靠近输入的层也可以获得全局的感受野,这一点在很多任务中都是非常有用的。

其次是 Excitation 操作,它是一个类似于循环神经网络中门的机制。通过参数 w 来为每个特征通道生成权重,其中参数 w 被学习用来显式地建模特征通道间的相关性。

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

上左图是将 SE 模块嵌入到 Inception 结构的一个示例。方框旁边的维度信息代表该层的输出。

这里我们使用 global average pooling 作为 Squeeze 操作。紧接着两个 Fully Connected 层组成一个 Bottleneck 结构去建模通道间的相关性,并输出和输入特征同样数目的权重。我们首先将特征维度降低到输入的 1/16,然后经过 ReLu 激活后再通过一个 Fully Connected 层升回到原来的维度。这样做比直接用一个 Fully Connected 层的好处在于:1)具有更多的非线性,可以更好地拟合通道间复杂的相关性;2)极大地减少了参数量和计算量。然后通过一个 Sigmoid 的门获得 0~1 之间归一化的权重,最后通过一个 Scale 的操作来将归一化后的权重加权到每个通道的特征上。

除此之外,SE 模块还可以嵌入到含有 skip-connections 的模块中。上右图是将 SE 嵌入到 ResNet 模块中的一个例子,操作过程基本和 SE-Inception 一样,只不过是在 Addition 前对分支上 Residual 的特征进行了特征重标定。如果对 Addition 后主支上的特征进行重标定,由于在主干上存在 0~1 的 scale 操作,在网络较深 BP 优化时就会在靠近输入层容易出现梯度消散的情况,导致模型难以优化。

目前大多数的主流网络都是基于这两种类似的单元通过 repeat 方式叠加来构造的。由此可见,SE 模块可以嵌入到现在几乎所有的网络结构中。通过在原始网络结构的 building block 单元中嵌入 SE 模块,我们可以获得不同种类的 SENet。如 SE-BN-Inception、SE-ResNet、SE-ReNeXt、SE-Inception-ResNet-v2 等等。

4 空间和通道混合注意力机制

SA + CA(spitial attention+channel attention)空间和通道相加就是混合注意力机制。

SA + CA 的使用有 BAM CBAM 两种代码方式,简单来说,spitial attention 矩阵 与 channel attention 矩阵相乘得到 SA+CA的效果。

 1)CBAM(Convolutional Block Attention Module)

ECCV2018的一篇文章,主要贡献为提出一个新的网络结构。SENet,在feature map的通道上进行attention生成,然后与原来的feature map相乘。这篇文章指出,该种attention方法只关注了通道层面上哪些层会具有更强的反馈能力,但是在空间维度上并不能体现出attention的意思。CBAM作为本文的亮点,将attention同时运用在channel和spatial两个维度上,CBAM与SE Module一样,可以嵌入了目前大部分主流网络中,在不显著增加计算量和参数量的前提下能提升网络模型的特征提取能力。

在网络结构中引入attention机制可以提升网络模型的特征表达能力。attention不止能告诉网络模型该注意什么,同时也能增强特定区域的表征。CBAM在channel和spatial两个维度上引入了attention机制。CBAM结构概览如下所示:

CBAM主要对其进行以下两个运算:

其中等号右边的操作符表示的是element-wise的点乘。Mc表示在channel维度上做attention提取的操作,Ms表示的是在spatial维度上做attention提取的操作。下图分别表示了Channel Attention Module和Spatial Attention Module的处理过程。

 5,总结

Channel attention module
这部分的工作与SENet很相似,都是首先将feature map在spatial维度上进行压缩,得到一个一维矢量以后再进行操作。与SENet不同之处在于,对输入feature map进行spatial维度压缩时,作者不单单考虑了average pooling,额外引入max pooling作为补充,通过两个pooling函数以后总共可以得到两个一维矢量。global average pooling对feature map上的每一个像素点都有反馈,而global max pooling在进行梯度反向传播计算只有feature map中响应最大的地方有梯度的反馈,能作为GAP的一个补充。

Spatial attention module
这部分工作是论文跟SENet区别开来的一个重要贡献,除了在channel上生成了attention模型,作者表示在spatial层面上也需要网络能明白feature map中哪些部分应该有更高的响应。首先,还是使用average pooling和max pooling对输入feature map进行压缩操作,只不过这里的压缩变成了通道层面上的压缩,对输入特征分别在通道维度上做了mean和max操作。最后得到了两个二维的feature,将其按通道维度拼接在一起得到一个通道数为2的feature map,之后使用一个包含单个卷积核的隐藏层对其进行卷积操作,要保证最后得到的feature在spatial维度上与输入的feature map一致,如同上图中下部分网络所示。

可以总结为如下的一张手绘图:

本章笔记主要参考以下博文是:

【AI不惑境】计算机视觉中注意力机制原理及其模型发展和应用

大话注意力机制(Attention Mechanism) - 雪饼的个人空间 - OSCHINA - 中文开源技术交流社区

深度学习中的注意力机制(2017版)_张俊林的博客-CSDN博客_注意力机制

【论文复现】CBAM: Convolutional Block Attention Module_luuuyi的博客-CSDN博客

深度学习笔记------注意力机制相关推荐

  1. [深度学习学习笔记]注意力机制-Attentional mechanism

      注意力机制最早在自然语言处理和机器翻译对齐文本中提出并使用,并取得了不错的效果.在计算机视觉领域,也有一些学者探索了在视觉和卷积神经网络中使用注意力机制来提升网络性能的方法.注意力机制的基本原理很 ...

  2. 《神经网络与深度学习》-注意力机制与外部记忆

    注意力机制与外部记忆 1. 认知神经学中的注意力 2. 注意力机制 2.1 注意力机制的变体 2.1.1 硬性注意力 2.1.2 键值对注意力 2.1.3 多头注意力 2.1.4 结构化注意力 2.1 ...

  3. 【深度学习】注意力机制

    注意力机制 之前接触到的seq2seq模型当中,解码器只依赖编码器最后一个时间步的隐藏状态作为解码器自身的初始隐藏状态.这个隐藏状态融合了所有输入序列的信息. 注意力机制的提出与一个心理学问题相关,假 ...

  4. 深度学习【注意力机制(Attention)原理和实现】

    文章目录 一 Attention的原理和实现 1. Attention的介绍 2. Attenion的实现机制 2.1 Attention的实现过程 2.2 不同Attention的介绍 2.2.1 ...

  5. 深度学习:注意力机制与外部记忆

    前言 神经网络中可以存储的信息量称为网络容量(Network Capacity). 一般来讲,其存储容量和神经元的数量以及网络的复杂度成正比. 如果要存储越多的信息,神经元数量就要越多或者网络要越复杂 ...

  6. 【动手深度学习-笔记】注意力机制(一)注意力机制框架

    生物学中的注意力提示 非自主性提示: 在没有主观意识的干预下,眼睛会不自觉地注意到环境中比较突出和显眼的物体. 比如我们自然会注意到一堆黑球中的一个白球,马路上最酷的跑车等. 自主性提示: 在主观意识 ...

  7. 【动手深度学习-笔记】注意力机制(四)自注意力、交叉注意力和位置编码

    文章目录 自注意力(Self-Attention) 例子 Self-Attention vs Convolution Self-Attention vs RNN 交叉注意力(Cross Attenti ...

  8. 《繁凡的深度学习笔记》前言、目录大纲 一文让你完全弄懂深度学习所有基础(DL笔记整理系列)

    <繁凡的深度学习笔记>前言.目录大纲 (DL笔记整理系列) 一文弄懂深度学习所有基础 ! 3043331995@qq.com https://fanfansann.blog.csdn.ne ...

  9. 下载量过百万的吴恩达机器学习和深度学习笔记更新了!(附PDF下载)

    今天,我把吴恩达机器学习和深度学习课程笔记都更新了,并提供下载,这两本笔记非常适合机器学习和深度学习入门.(作者:黄海广) 0.导语 我和同学将吴恩达老师机器学习和深度学习课程笔记做成了打印版,放在g ...

最新文章

  1. 无法定位软件包_使用Degraph管理软件包依赖关系
  2. 十以内的加减java编写程序_Java实现随机出题,10道10以内加减法计算代码实例
  3. 常用的函数式接口_Predicate接口_默认方法ornegate
  4. python中def root的用法_python scipy optimize.root_scalar用法及代码示例
  5. 34 SD配置-销售凭证设置-定义销售凭证类型
  6. 《Qt 数据库详解》博客系列文章
  7. B站、字节跳动等上榜2021福布斯中国最佳雇主榜;中兴发布“5G 智能T恤”:可监测呼吸;Linux 5.13 发布|极客头条...
  8. poj 1753 Flip Game 高斯消元 异或方程组 求最值
  9. 最后一波机会!!本周你最不能错过的互联网大会,VIP门票0元限时抢!
  10. 改变世界的17个数学公式
  11. 把阿拉伯数字1,2,3...转化成一,二,三
  12. Eclipse官网查找历史版本Eclipse
  13. 安徽省池州市谷歌卫星地图下载
  14. STM32平台下官方DMP库6.12超详细移植教程
  15. 逃避条件作用和回避条件作用,两者的区别是?|小白心理-312/347考研答疑
  16. 基于VANET车辆组网通信系统的matlab仿真
  17. HY-SRF05超声波测距模块的使用
  18. 计算机发明原理,40个发明原理概述.ppt
  19. python使用xlrd读取excel
  20. 方法的重载---(Java版)

热门文章

  1. 计算机配置排行表,笔记本配置排行榜介绍
  2. 使用Kafka 0.9.0版本的一个大坑-不要使用didi_manager
  3. TP-LINK TL-WR841N 路由变无线交换机设置
  4. C语言ATM机模拟操作程序
  5. 考研复试英文自我介绍模板(学长已上岸)
  6. 加密Escape/解密Unescape
  7. c语言remove和rename不起作用,C语言探索之旅 | 第二部分第七课:文件读写
  8. 如何实现一个丝滑的点击水波效果
  9. NOI模拟 五彩斑斓
  10. MySQL 进阶 索引 -- SQL性能分析(SQL执行频率:查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次、慢查询日志、 profile详情、explain)