CBAM: Convolutional Block Attention Module
CBAM: Convolutional Block Attention Module
网址:https://arxiv.org/pdf/1807.06521.pdf
Introduction
本文主要工作:
1))改进了se-net中学习channel权重的方式
2)提出一种学习空间位置重要性的方法
方法的出发点:
1)当前学习channel权重的方法多采用average pooling,本文同时使用average和max poling,增强空间特征的表达;
2)空间attention机制中,本文希望区别出不同位置的重要性关系。
Method
1.CBAM的主要结构
2.channel attention
为了得到通道维度的attention,我们先要在空间维度进行squeeze(具体参照SE-Net)操作,使空间h*w的特征降维到1*1。如何聚合空间维度的特征?长期以来大家都适用average pooling,但我们认为也可以使用max-pooling来进一步区分特征。
具体步骤:同时使用average-pooling和max-pooling聚合空间维度特征,产生两个空间维度描述符:,随后经MLP(2层fc+**+sigmoid层,和SE-Net相同,只是squeeze操作多了一步max pooling),为每个通道产生权重,最后将权重与原始未经channel attention相乘,公式:
如果之前理解过SE-Net,这一部分看起来还是很简单的~
3)spatial attention
同样采用max和average pooling操作,但是在channel维度执行,为了使原始特征中c维的通道数,降到1维度,从而学习空间attention。公式:
直接上这部分代码:
对于输入的特征x,先经self.compress()操作,也就是对应的ChannelPool,具体看ChannelPool,发现就是在dim=1(channel维度)执行了max和mean操作,然后又在channel维度concat两次操作的输出。随后执行卷积,因为上面的concat会使输出特征的channel是原始特征channel的两倍,所以这里的卷积有channel维度下降的作用。最后经sigmoid为每个空间点得到0-1之间的权重分数。
3)结合空间和channel attention
作者认为顺序链接两个attention效果最好,但两者的先后顺序值得探究。
4)将CBAM接在resnet中
是接在了每个block的残差分支中:
experiment
1)channel attention中average和max操作的结果
2)空间attenion中不同操作的组合
3)channel和空间attention的衔接
个人理解:
ucf101上实验了一下,效果不明显,涨点微小。可能是我个人的问题....也可能是任务不同吧