最近在看论文,发现很多的论文都用到了attentive moudule。 这也得益于越来越多的实验证明自注意力机制对于:什么是重要的?这个问题的合理解决。相比传统的直接生成特征图,对于每一个item进行同样的卷积提取特征等操作,让神经网络来自己学习哪部分是前景,哪部分是背景噪声,不重要,加入一个attentive module是一个很聪明的办法。 现在学术界涌现出许多的attentive module的设计方法,主要还是应用在2d目标检测领域。 这篇博客主要是对于一些开源的影响力大的模块进行一个介绍。
CMBA
论文题目:CBAM: Convolutional Block Attention Module eccv2018 已经开源 这篇文章思考了两个问题,对于一个输入的特征图(HWC),什么(what)是重要的,以及哪一块(where)是重要的。
所以文章架构如上,这个attention module主要包含两个部分: channel attention module 这个部分解决(what)的问题。 对于输入的特征图,这是个什么东西?我们在网络中常用的方法又max pool 和mean pool。这两种featuer aggregation的方法各有优劣,文章将两者结合起来进行操作。 其实没啥好说的,有深度学习基础的同学看到上面的图基本可以知道作者是怎么做的。 经过该模块我们得到一个11C的vector,这表示的便是这个特征图它代表什么东西。 Spatial attention module 这个模块则主要解决“where”的问题,特征图的哪一块信息是重要的? 主要是在channel维度进行max和mean操作,集合每一个voxel的所有信息。然后将它们进行一个拼接后进行conv操作。最后激活函数进行激活。得到的是一个HW1的特征图。
这两个模块进行串联得到了最好的结果。 在resnet中进行了这样的应用:
模块参数很少很轻、可以在神经网络中广泛应用。比如之前我讲过的一篇文章HVPR便应用了spatial attention。以及trans上一篇文章:SIEV-Net。
BAM: Bottleneck Attention Module
cmba同组同时期的作品。 British Machine Vision Association2018 基本思路是一样的,不过总体框架不一样: channel branch是一样的: spatial attention branch 这个层面的attention计算主要是要扩大每一个pixel在hw维度上的感受野 作者引入了膨胀卷积 主要是首先1x1维度的卷积进行channel减小 随后3x3的卷积进行感受野扩大 最后1X1的卷积生成HW1的feature
对于上述两个通道得到的feature map 将它们进行扩张到HWC维度 经过一盒sigmoid函数激活 再与原来的input tensor 进行元素级别的相乘
Coordinate Attention
论文题目:Coordinate Attention for Efficient Mobile Network Design 新加坡国立 2021cvpr 这篇文章主要是在SE上进行改进的。se直接进行global pool 显然是会失去位置信息的。这样子强调了channel维度的信息。 而我们熟悉的cmba则是通过channel 和 spatial串联得到的。这种方法是不是suboptimal的还没有一个定论。 这种方法则是将channel 和spatial维度综合起来 首先计算H和W维度的位置信息: concat起来后 作为一个维度进行linear函数处理及激活 最后分开为两个维度 对于featuremap进行加权 很简单的思想 却实现了两种方案。
效果好于cmba
|