【深度学习模型】cv中Attention的奇妙旅途——讲讲Self-Attention, SENet和CBAM


前言

由于注意力机制的高速发展,我尝试着对attention形成一种比较系统化的理解,选了比较有代表性的Self-Attention, SENet和CBAM,整理成本文。

1. Self-Attention

在谷歌发表的Attention Is All You Need之后,Self-Attention开始广为人知。正如我此前对这篇论文的讲解,最终的注意力可以表示为下图,其中Q为Query,K为Key,V为Value,三者都是由输入X经过不同的映射得来的。这个公式可以这么记,先通过相乘得到Query和Key的相似度,而后归一化加softmax成为注意力权重,该权重乘以Value值就是输出的新表达了。
在这里插入图片描述
然而,这个公式在这里的输入X的维度是time × embedding,那么怎么用于三维的图像呢?很自然的可以想到,时序信号中的时间可以类比到图像中的空间,那么只需要把长和宽两个维度拉成一个维度,就形成了一行地的空间信息。那么接下来,剩下的通道(单通道或三通道),就可以类比成时序信号中token的embedding。因此,Self-Attention公式在图像上的输入的维度是spatial × channel。那么,图像上的Self-Attention本质上是计算一种空间权重。

2. SENet

2017年Squeeze-and-Excitation Networks获得了ILSVRC的冠军,使得SENet名声大噪。其实这篇论文的核心在于提出了一种很方便嵌入其他模型的模块————SE block。它的结构图如下。前边是传统的卷积操作,得到了特征图U(H x W x C)。而后看上边的支路,共有两个操作,一个是Squeeze一个是Excitation,可以得到一串通道上的注意力权重,再把它乘进各个通道,就得到了新的特征图。
在这里插入图片描述
Squeeze操作对U进行Global Average Pooling,得到一串(1 x 1 x C)的权重,这里就是注意力的雏形了,比起一开始Self注意力的QK矩阵真是简单粗暴了很多。
在这里插入图片描述
Excitation操作也很直接,就是把刚才得到的权重经过两层全连接层(后边带ReLU)再加一层Sigmoid。至于两层全连接的神经元数,第一层是输入C个而输出C/r个神经元,第二次则是输入C/r而输出C个神经元。可以看成一种压缩再恢复的过程,r表示压缩程度。作者的实验表明r取16时效果比较好。所以,图像上的SENet本质上是计算一种通道权重。

3. CBAM

现在我们知道了有空间的注意力,有通道的注意力,那么也可以想到一种两者都有的注意力。CBAM: Convolutional Block Attention Module就干了这么一件事。它也是一种可嵌入的模块,结构图如下,包含通道注意力模块和空间注意力模块。
在这里插入图片描述
这里分别讲解这两种模块。
通道注意力模块
在这里插入图片描述
通道注意力模块其实基本就是SE block,不同点在于除了SE用的AvgPool之外还用了MaxPool,相当于有两种Squeeze方式,而后得到的两串注意力雏形各自同样经过两层带ReLU的全连接层(注意这里avg和max使用的全连接是共享的,有点奇怪,个人感觉不共享会好一些),相加起来再经过Sigmoid,就得到了通道上的注意力,然后乘回去得到了通道上更新了的特征图。
在这里插入图片描述

空间注意力模块
在这里插入图片描述
空间注意力模块可以说是用Self的思想和SENet的操作形成的。可以看到,刚才的通道注意力是在空间上进行Pool,那么,空间注意力是不是也可以在通道上进行Pool呢?这就形成了空间注意力模块。首先,它基于通道上进行global max pooling 和global average pooling,得到的两张空间图拼接一下形成2通道,再进行一下卷积(实验表明7 * 7卷积效果好些)降成单通道,类似的经过一个Sigmoid,就得到了空间注意力权重。乘回去就得到了空间上更新了的特征图。
在这里插入图片描述
所以,CBAM基于senet的通道注意力,引入空间注意力,本质上是计算了通道和空间的权重。

4. 总结

经过这么一个流程可以看到:

  • 注意力就是计算通道(嵌入)和空间(时间)的注意力权重,Self是空间,SENet是通道,CBAM是空间加通道。甚至于空间上的注意力还可以拆分,只有横轴的注意力或只有纵轴的注意力,这些都视实际输入的图像需求来选择。
  • 注意力的形式变得简单。一开始的Self需要经过QK矩阵算出一个三维(nlp中是二维,空间拉出长宽就变成了三维)的注意力权重,表示空间上每一个点与空间上所有点的注意力。CBAM中的空间注意力模块,只需经过pooling和一些简单的其它操作即得到了一个二维的注意力权重,表示一种整体上应该关注空间上的哪些位置。

猜你喜欢

转载自blog.csdn.net/tobefans/article/details/125431893
今日推荐