为了提高神经网络的性能,许多研究都集中在 “depth, width, and cardinality” 上,而本文的重点在 “Attention”。
“注意力机制(Attention mechanism)”听起来很高大上,实际上是关于调整权重的问题,这篇论文提出了一个“即插即用的”的网络结构——CBAM,能够很方便的加到其他的CNN结构中。CBAM利用了通道注意力(channel attention)与空间注意力(spatial attention)。实际上就是在通道(channel)维度上与空间(spatial)维度上对传进来的特征图(intermediate feature map)进行加权处理,权重越大,说明这一通道(channel 维度)或这一点(spatial维度)的信息很重要。如何确定给每一个channel或每一点的权重大小,不同的论文可能会有不同的衡量方法,例如采用均值,例如采用方差等等,这篇论文是通过最大池化(MaxPool)与平均池化(AvgPool)来决定的。
先看Channel Attention,结构如图所示:
Channel Attention 关注的是channel维度。特征图的每个通道被认为是一种特征检测器检测到的特征(每个通道特征由不同的卷积核(Kernel)得到),论文中说的是“what”,就是说哪一个channel比较重要(有用信息多)。对于一个特征图(C*H*W),计算出每个channel的重要性,也就是权值(C*1*1),将权值与特征图相乘得到加权的特征图,就是Channel Attention。权值通过MaxPool与AvgPool计算(为什么是这两个,因为实验结果证明使用这两个比单独地使用其中一个效果要好)。为了获得Channel维度上的权值,需将每一个Channel(1*H*W)压缩成一个数(1*1*1),两种方法:计算每个Channel的平均值(AvgPool)和最大值(MaxPool)。计算完后,将它们通过一个共同的多层感知机MLP(也就是含有一个隐层的全连接网络),MLP的结构是(输入神经元:C,隐层神经元:C/r,输出神经元:C),再将这两个输出相加,通过sigmoid函数归一化,得到最后的权重。将此权重与原始特征图相乘,得到channel维度上的加权特征图。Channel Attention基本完成。
Spatial Attention 关注的是“where”,就是每一个通道上(1*H*W)哪一点比较重要,因此我们需要生成一个维度为(1*H*W)的空间权重。怎么生成这个权重,同样,我们将不同的channel在同一平面空间点上的值做平均(AvgPool)和取最大值(MaxPool)来获得(1*H*W)的权重。再通过一个卷积层和sigmoid函数来得到最终的权重,将此权重在spatial维度上和每一个channel(1*H*W)相乘,得到spatial维度上的加权特征图。spatial attention基本完成。
最后的问题是按什么顺序给传进来的特征图加上Channel Attention与Spatial Attention。这里有两种思路,(1)并行模型,Channel Attention 与Spatial Attention并行;(2)顺序模型,先让特征图通过Channel Attention再通过Spatial Attention或者相反。实验证明先通过Channel Attention比较好(深度学习有时候就是不讲道理,看结果调)。因此最后的结构如下所示:
原文地址:CBAM: Convolutional Block Attention Module
Official PyTorch code:https://github.com/Jongchan/attention-module