论文题目:《CBAM: Convolutional Block Attention Module》
论文地址:https://arxiv.org/pdf/1807.06521.pdf

文章目录

  • 一、前言
  • 二、注意力机制(CBAM)
  • 2.1 Channel Attention Module(CAM)
  • 2.1.1(多层感知机)MLP
  • 1.什么是激活函数
  • 2. 为嘛使用激活函数?
  • 3.激活函数需要具备以下几点性质:
  • pooling的使用
  • Spatial Attention Module(SAM)
  • CAM和SAM的组合形式
  • CBAM可视化


一、前言

论文(2018年)提出了一种轻量的注意力模块( CBAM,Convolutional Block Attention Module ),可以在通道和空间维度上进行 Attention 。论文在 ResNet 和 MobileNet 等经典结构上添加了 CBAM 模块并进行对比分析,同时也进行了可视化,发现 CBAM 更关注识别目标物体,这也使得 CBAM 具有更好的解释性。

二、注意力机制(CBAM)

这是一种用于前馈卷积神经网络的简单而有效的注意模块。 给定一个中间特征图,我们的模块会沿着两个独立的维度(通道和空间)依次推断注意力图,然后将注意力图乘以输入特征图以进行自适应特征修饰。 由于CBAM是轻量级的通用模块,因此可以以可忽略的开销将其无缝集成到任何CNN架构中,并且可以与基础CNN一起进行端到端训练。

GAM注意力pytorch 注意力机制 cnn_深度学习

2.1 Channel Attention Module(CAM)

通道上的Attention模块以及具体计算如下图所示:

GAM注意力pytorch 注意力机制 cnn_pytorch_02


GAM注意力pytorch 注意力机制 cnn_GAM注意力pytorch_03

具体流程如下:
将输入的特征图F(H×W×C)分别经过基于width和height的global max pooling(全局最大池化)和global average pooling(全局平均池化),得到两个1×1×C的特征图,接着,再将它们分别送入一个两层的神经网络(MLP),第一层神经元个数为 C/r(r为减少率),激活函数为 Relu,第二层神经元个数为 C,这个两层的神经网络是共享的。而后,将MLP输出的特征进行基于element-wise的加和操作,再经过sigmoid激活操作,生成最终的channel attention feature,即M_c。最后,将M_c和输入特征图F做element-wise乘法操作,生成Spatial attention模块需要的输入特征。

2.1.1(多层感知机)MLP

多层感知机(MLP,Multilayer Perceptron)也叫人工神经网络(ANN,Artificial Neural Network),除了输入输出层,它中间可以有多个隐层,最简单的MLP只含一个隐层,即三层的结构,如下图:

GAM注意力pytorch 注意力机制 cnn_pytorch_04


从上图可以看到,多层感知机层与层之间是全连接的。多层感知机最底层是输入层,中间是隐藏层,最后是输出层。

隐藏层的神经元怎么得来?首先它与输入层是全连接的,假设输入层用向量X表示,则隐藏层的输出就是 f (GAM注意力pytorch 注意力机制 cnn_激活函数_05+GAM注意力pytorch 注意力机制 cnn_深度学习_06),GAM注意力pytorch 注意力机制 cnn_激活函数_07是权重(也叫连接系数),GAM注意力pytorch 注意力机制 cnn_深度学习_06是偏置,函数f 可以是常用的sigmoid函数或者tanh函数:

1.什么是激活函数

如下图,在神经元中,输入的 inputs 通过加权,求和后,还被作用了一个函数,这个函数就是激活函数 Activation Function:

GAM注意力pytorch 注意力机制 cnn_激活函数_09

2. 为嘛使用激活函数?

  • 不使用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,输出都是输入的线性组合。
  • 使用激活函数,能够给神经元引入非线性因素,使得神经网络可以任意逼近任何非线性函数,这样神经网络就可以利用到更多的非线性模型中。

3.激活函数需要具备以下几点性质:

  • 连续并可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数。
  • 激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。
  • 激活函数的导函数的值域要在一个合适的区间内,不能太大也不能太小,否则会影响训练的效率和稳定性。


pooling的使用

GAM注意力pytorch 注意力机制 cnn_神经网络_10


在channel attention中,表1对于pooling的使用进行了实验对比,发现avg & max的并行池化的效果要更好。这里也有可能是池化丢失的信息太多,avg&max的并行连接方式比单一的池化丢失的信息更少,所以效果会更好一点。

Spatial Attention Module(SAM)

空间上的Attention模块以及具体计算如下图所示:

GAM注意力pytorch 注意力机制 cnn_激活函数_11


GAM注意力pytorch 注意力机制 cnn_GAM注意力pytorch_12


具体流程如下:

将Channel attention模块输出的特征图F‘作为本模块的输入特征图。首先做一个基于channel的global max pooling 和global average pooling,得到两个H×W×1 的特征图,然后将这2个特征图基于channel 做concat操作(通道拼接)。然后经过一个7×7卷积(7×7比3×3效果要好)操作,降维为1个channel,即H×W×1。再经过sigmoid生成spatial attention feature,即M_s。最后将该feature和该模块的输入feature做乘法,得到最终生成的特征。

CAM和SAM的组合形式

通道注意力和空间注意力这两个模块能够以并行或者串行顺序的方式组合在一块儿,关于通道和空间上的串行顺序和并行作者进行了实验对比,发现先通道再空间的结果会稍微好一点。具体实验结果如下:

GAM注意力pytorch 注意力机制 cnn_神经网络_13


从表中可以看出,在ResNet50的基准架构尚,两个attetnion子模块的连接顺序里面的确是channel + spatial的要更好一些,也要好于标准的SENet的通道attention。

CBAM可视化

GAM注意力pytorch 注意力机制 cnn_pytorch_14


利用 Grad-CAM 对不一样的网络进行可视化后,能够发现,引入 CBAM 后,特征覆盖到了待识别物体的更多部位,而且最终判别物体的几率也更高,这代表注意力机制的确让网络学会了关注重点信息。