草庐IT

视觉 注意力机制——通道注意力、空间注意力、自注意力

一颗小树x 2023-04-10 原文

前言

本文介绍注意力机制的概念和基本原理,并站在计算机视觉CV角度,进一步介绍通道注意力、空间注意力、混合注意力、自注意力等。

目录

前言

一、注意力机制

二、通道注意力机制

三、空间注意力机制

四、混合注意力机制 

五、自注意力机制

六、注意力基础

 6.1 注意力机制原理

6.2 注意力机制计算过程


一、注意力机制

我们可以通过眼睛看到各种各样的事物,感知世界上的大量信息;可以让自己免受海量信息的干扰,是因为人的选择能力,可以选择重要的信息,而忽视不重要信息

举个例子,下面有一张图片,当我们看到这张图片的时候会下意识把注意力集中到熊猫的身上,而忽略背景。

即:在观看这幅图像的时候,并非能够对图片的所有信息给予相同的关注度,而是将注意力着重放在某个局部区域。

同样,希望网络也具有这种能力,从而在网络中引入了注意力机制。注意力机制,是对输入进行加权再输出,希望网络关注到的地方给较大的权重,不希望网络注意的地方给较小的权重。

再举个例子,在自然语言处理领域,在分析一句话的时候,并不是所有的词的信息都需要被关注,可以选择重要的词分析,即可理解句子所传达的语义。

二、通道注意力机制

通道注意力机制的代表模型是:压缩和激励网络(Squeeze-and-Excitation Networks,SENet)。SENet 分为压缩和激励两个部分,其中压缩部分的目的是对全局空间信息进行压缩,然后在通道维度进行特征学习,形成各个通对道的重要性,最后通过激励部分对各个通道进行分配不同权重的。

上图是SE模块的结构, 在压缩部分,输入的元素特征图的维度是 H×W×C,H、W 和 C 分别代表高度、宽度和通道数。压缩部分的功能是将维数从 H×W×C 压缩至1×1×C,即把 H×W 压缩为 1×1 维,这个过程由全局平均池化实现。

激励部分,需要将压缩部分得到的 1×1×C 的维度融入全连接层,预测各个通道的重要程度,然后再激励到前面特征图对应通道上进行操作。采用简单的门控机制与Sigmoid 激活函数。

小结:在通道注意力机制,学习各个通道的重要性时,是先对特征图的空间进行压缩,然后在通道维度进行学习,得到各个通道的重要性。

三、空间注意力机制

空间注意力机制的代表模型是:空间变换神经网络(Spatial Transformer Networks,STN),STN 能够对各种形变数据在空间中进行转换自动捕获重要区域特征。它能够保证图像在经过裁剪、平移或者旋转等操作后,依然可以获得和操作前的原始图像相同的结果。

举个例子,在MNIST 数字分类的中应用STN,该分类过程一共包含 4 个步骤:

  1. MNIST中的数字,是经过随机平移、缩放和旋转处理;把它们输入到STN网络中;
  2. 通过STN网络,预测前面输入数字的变换(是平移了?还是缩放了?或是旋转了?)
  3. STN网络预测出“变换前的数字”,即没经过变换的数字是怎样的
  4. 最终进行分类预测

 STN 网络包括局部网络、参数化网络采样(网络生成器)和差分图像采样。

局部网络:预测输入数字的变换(是平移了?还是缩放了?或是旋转了?)

网络生成器:获得输出特征图坐标点在输入特征图中坐标点的对应位置。

四、混合注意力机制 

在混合注意力机制中,通道注意力和空间注意力可以通过串联、或者并联的方式进行组合。

混合注意力机制的代表模型是:卷积注意力模块(Convolutional Block Attention Module,CBAM),它包括通道注意力模块CAM、和空间注意力模块SAM。

CBAM的模型结构如下,它对输入的特征图,首先进行通道注意力模块处理;得到的结果,再经过空间注意力模块处理,最后得到调整后特征。

通道注意力模块CAM

CAM的输入是特征图,维度设为HxWxC;其中H是指特征图的高度,W是指宽度,C是指通道数。

它的思路流程是:

  1. 首先对输入的特征图,进行全局池化和平均池化;(在空间维度进行池化,压缩空间尺寸;便于后面学习通道的特征)
  2. 然后将得到全局和评价池化的结果,送入到多层感知机中MLP学习;(基于MLP学习通道维度的特征,和各个通道的重要性)
  3. 最后将MLP输出额结果,进行“加”操作,接着经过Sigmoid函数的映射处理,得到最终的“通道注意力值”。

计算公式如下:

空间注意力模块SAM

SAM的输入是CAM输出的特征图。

它的思路流程是:

  1. 首先对输入的特征图,进行全局池化和平均池化;(在通道维度进行池化,压缩通道大小;便于后面学习空间的特征)
  2. 然后将全局池化和平均池化的结果,按照通道拼接;得到特征图维度是HxWx2,
  3. 最后对拼接的结果,进行卷积操作,得到特征图维度是HxWx1;接着通过激活函数处理。

计算公式如下:

五、自注意力机制

背景

  在注意力机制引入计算机视觉前,主要是靠叠加卷积层与池化层来进行特征提取,并扩大感受野。举个例子,在语义分割中,Deeplab系列提出的带有多尺度空洞卷积的 ASPP 模块

  • ASPP对输入的特征图,采用不同dilation rate 的空洞卷积进行卷积操作,以多个不同比例获取图像的上下文信息。
  • ASPP模块只能利用空洞卷积从像素点周围少数点去获取上下文信息,而不能形成密集的全局上下文信息

为了获得密集的全局上下文信息,从而建立像素两两之间的依赖关系,引入“自注意力机制”。

六、注意力基础

 6.1 注意力机制原理

注意力机制在语义分割和图像描述生成方面被广泛使用。使用注意力处理任务时,不同信息的重要程度由权值来体现。

注意力机制对不同信息关注度区分体现在权值分配,注意力机制可以视为查询矩阵以及加权平均值构成了多层感知机(Multilayer Perceptron, MLP)。

注意力的思想,类似于寻址。给定 Query,去 Source 中计算 Query和不同 Key 的相关性,即计算 Source 中不同 Value 值的权重系数;Value 的加权平均结果可以作为注意力值。

注意力的计算公式如下:

其中,Lx代表Source的长度。

6.2 注意力机制计算过程

大多数方法采用的注意力机制计算过程可以细化为如下三个阶段。

三阶段的注意力机制计算流程:

  • 第一阶段是计算 Query和不同 Key 的相关性,即计算不同 Value 值的权重系数;
  • 第二阶段对上一阶段的输出进行归一化处理,将数值的范围映射到 0 和 1 之间。
  • 第三阶段,对值和每个值对应的权重相乘的结果做累加操作,从而获得注意力数值。

公式化表示:

第一阶段是计算 Query和不同 Key 的相关性,即计算不同 Value 值的权重系数;相关性计算主要包括点积余弦相似性或者引入神经网络这三种方法。计算方式分别如下:

 第二阶段对上一阶段的输出进行归一化处理,将数值的范围映射到 0 和 1 之间。其中,ai表第 i 个值被分为的权重值。

 第三阶段,对值和每个值对应的权重相乘的结果做累加操作,从而获得注意力数值。

参考文献

[1] 谢雨杉. 基于深度神经网络的图像语义分割技术研究[D].成都:电子科技大学,2022.

[2] 冀芒来. 基于注意力机制的道路驾驶场景实时语义分割[D].吉林:吉林大学,2022.

本文只是简单介绍了注意力机制中的通道注意力、空间注意力、自注意力,后续文章会分别详细介绍,其中的模型包括:SK-Net、ResNeSt、DANet、PFANet、SOCA、ECA-Net等等

有关视觉 注意力机制——通道注意力、空间注意力、自注意力的更多相关文章

  1. ruby-on-rails - 从应用程序中自定义文件夹内的命名空间自动加载 - 2

    我们目前正在为ROR3.2开发自定义cms引擎。在这个过程中,我们希望成为我们的rails应用程序中的一等公民的几个类类型起源,这意味着它们应该驻留在应用程序的app文件夹下,它是插件。目前我们有以下类型:数据源数据类型查看我在app文件夹下创建了多个目录来保存这些:应用/数据源应用/数据类型应用/View更多类型将随之而来,我有点担心应用程序文件夹被这么多目录污染。因此,我想将它们移动到一个子目录/模块中,该子目录/模块包含cms定义的所有类型。所有类都应位于MyCms命名空间内,目录布局应如下所示:应用程序/my_cms/data_source应用程序/my_cms/data_ty

  2. 阿里云国际版免费试用:如何注册以及注意事项 - 2

    作为新的阿里云用户,您可以50免费试用多种优惠,价值高达1,700美元(或8,500美元)。这将让您了解和体验阿里云平台上提供的一系列产品和服务。如果您以个人身份注册免费试用,您将获得价值1,700美元的优惠。但是,如果您是注册公司,您可以选择企业免费试用,提交基本信息通过企业实名注册验证,即可开始价值$8,500的免费试用!本教程介绍了如何设置您的帐户并使用您的免费试用版。​关于免费试用在我们开始此试用之前,您还必须遵守以下条款和条件才能访问您的免费试用:只有在一年内创建的账户才有资格获得阿里云免费试用。通过此免费试用优惠,用户可以免费试用免费试用活动页面上列出的每种产品一次。如果您有多个帐

  3. ruby 认为我在引用一个顶级常量,即使我指定了完整的命名空间 - 2

    在我的应用程序中我有classUserincludeUser::FooendUser::Foo定义在app/models/user/foo.rb现在我正在使用一个定义了自己的Foo类的库。我收到此错误:warning:toplevelconstantFooreferencedbyUser::FooUser仅引用具有完整路径的Foo,User::Foo,而Foo实际上从来没有指的是Foo。这是怎么回事?更新:才想起我之前遇到过同样的问题,在问题1中看到这里:HowdoIrefertoasubmodule's"fullpath"inruby? 最佳答案

  4. Ruby 命名空间与类还是模块? - 2

    考虑Ruby类Foo::Bar。惯例是将“Foo”命名空间作为一个模块,但它也可以很容易地作为一个类:moduleFoo;classBar;end;end对比:classFoo;classBar;end;end在第二种情况下,Bar不是Foo的内部类,它只是在Foo的单例上定义的另一个常量。在这两种情况下,父类(superclass)都是Object并且它们只包含Kernel模块。它们的祖先链是相同的。因此,除了您可以根据其类使用Foo进行的操作(如果是类则实例化,如果是模块则扩展/包含),命名空间的性质是否对有任何影响酒吧?是否有令人信服的理由选择其中一个名称间距而不是另一个?我看到

  5. ruby - 如何在命名空间类中包含模块? - 2

    我在将模块包含在命名空间类中时遇到问题。下面的示例抛出错误uninitializedconstantBar::Foo::Baz(NameError)。我在这里缺少哪些基本的Ruby知识?moduleFoomoduleBazdefhelloputs'hello'endendendmoduleBarclassFooincludeFoo::Bazendendfoo=Bar::Foo.new 最佳答案 使用::强制查找到顶层:moduleBarclassFooinclude::Foo::Bazendend

  6. ruby - 如何为命名空间类定义 Fabricator - 2

    我想为类定义Fabricator,其命名空间类似于“Foo::Bar”。告诉我它的工作方式。这是我的代码。模型/foo.rbclassFooincludeMongoid::Documentembedded_in:foo_container,polymorphic:truefield:xxx....end模型/foo/bar.rbclassFoo::Bar数据/制造商/foo_bar_fabricator.rbFabricator(:foo_bar,class_name:'Foo::Bar')doyyy'MyString'zzz'MyString'end当我尝试在parino控制台上创建

  7. ruby-on-rails - Rails 中带后备功能的动态命名空间 Controller - 2

    我对新的Rails应用程序有一个有点奇怪的要求。我需要构建一个应用程序,其中所有路由都在多个命名空间中定义(让我解释一下)。我想要一个应用程序,其中学校科目(数学、英语等)是namespace:%w[mathenglish].eachdo|subject|namespacesubject.to_symdoresources:studentsendend这很棒而且有效,但它需要我为每个主题创建一个命名空间StudentsController,这意味着如果我添加一个新主题,那么我需要创建一个新Controller。我想创建一个Base::StudentsController,如果Math:

  8. ruby-on-rails - Rails 路由 : Nested, 成员、集合、命名空间、范围和可定制 - 2

    我想了解更多关于Rails路线的信息。成员和收藏#Exampleresourceroutewithoptions:resources:productsdomemberdoget'short'post'toggle'endcollectiondoget'sold'endend命名空间和作用域#Exampleresourceroutewithinanamespace:namespace:admindoresources:productsendscope:admindoresources:productsend约束,Redirect_to#Exampleresourceroutewithop

  9. ruby-on-rails - Rails 中 Controller 的嵌套命名空间 - 2

    我重构了我的Rails应用程序,我为每个子资源创建了一个Controller,这是相应的命名空间。api/v1/app/controller/manager.rbapi/v1/app/controller/manager/user.rbapi/v1/app/controller/manager/controller.rbapi/v1/app/controller/admin.rbapi/v1/app/controller/user.rbapi/v1/app/controller/controller.rbmanager命名空间下的用户资源的类定义是这样的classApi::V1::Ma

  10. ruby - Ruby 是否提供响应 OS X 上的 Apple 事件的机制? - 2

    我正在使用Ruby-Tk为OSX开发一个桌面应用程序,我想为该应用程序提供一个AppleEvents接口(interface)。这意味着应用程序将定义它将响应的AppleScript命令的字典(对应于发送到应用程序的Apple事件),并且用户/其他应用程序可以使用AppleScript命令编写Ruby-Tk应用程序的脚本。其他脚本语言支持此类功能——Python通过位于http://appscript.svn.sourceforge.net/viewvc/appscript/py-aemreceive/的py-aemreceive库和Tcl通过位于http://tclae.source

随机推荐