SENet模块是2017年国内汽车自动驾驶公司Momentum即魔门塔在CVPR2017上提出的,参考文章地址地址:SENet参考文章
cSENet,sSENet,csSENet是三种SENet的变体模块,是在CVPR2018上提出的,论文地址:《Concurrent Spatial and Channel `Squeeze & Excitation’ in Fully Convolutional Networks》
SKNet也是SENet的变体模块,是在CVPR2019上提出的,论文地址:Select Kernel Networks
一、先来理解什么是SENet:
fig1.Squeeze and Excitation Module
fig2.SE-Inception Module,SE-ResNet Module计算流程图
如图1所示:SENet通过显式地建模特征通道之间的相互依赖关系,在通道之间引入Attention 机制。包含两部分操作,Squeeze操作即挤压操作,和Excitation操作即激发操作。首先是输入(C,W,H)大小的feature map U,经过Squeeze操作,具体而言,如图2所示,就是先从通道角度进行GP即全局池化,将空间大小变为1*1(可以理解为实数),通道仍为C的feature map,可以理解为C个实数。然后是一个全连接层FC,在这一过程中一般把输入的维度降为1/16
,紧跟其后是一个Relu层和一个FC层,把维度恢复到输入的大小(Excitation
操作)。最后通过一个Sigmoid层把权重归一化到0~1
之间,再通过scale逐通道加权到先前的特征上,至此完成一次SE模块操作。
二、cSE、sSE和scSE模块
fig3.cSE、sSE和scSE模块
cSE模块:
其实cSE模块与SE模块本质上是一样的。只是在FC那,升降维度这里用的是1/2,而不是SENet论文里的1/16,原因是作者通过大量实验然后确定了这个超参数r是2或16,这样的话兼顾了模型的准确率和运算复杂度。
sSE模块:
sSE模块则是从另一个角度来引入注意力机制,即空间角度。首先是用1*1卷积降维,用Sigmoid函数激活,得到一个1*H*W维度的特征图。然后再经过特征重标定,与原来的U对应空间上相乘得到U^。
scSE模块:
scSE模块则是前两个模块的结合体,将通道和空间都考虑在内。即将两种模块的输出做一个加和操作。
三、SKNet(Select Kernel Network)
SKNet同样是一个轻量级嵌入式的模块,其灵感来源是,我们在看不同尺寸不同远近的物体时,视觉皮层神经元接受域大小是会根据刺激来进行调节的。那么对应于CNN网络,一般来说对于特定任务特定模型,卷积核大小是确定的,那么是否可以构建一种模型,使网络可以根据输入信息的多个尺度自适应的调节接受域大小呢?
基于这种想法,作者提出了Selective Kernel Networks(SKNet)。结构图如下
SKNet主要分为3个操作:Split、Fuse、Select:
Split:
将一个H'*W'*C'大小的特征图X做两种不同转换:X->U~和X->U^,所运用的卷积核大小分别是3和5(感觉有点类似Inception网络的想法,多尺度融合)进行完整卷积操作(包括efficient grouped/depthwise convolutions,Batch Normalization,ReLU function)。
Fuse:
这个操作和SENet的操作差不多,先将上一层即:U=U~+U^,然后对U做操作:先是一个GAP,即全局平均池化,将每个空间压缩成一系列实数。然后经过两个FC层,先降维再升维。需要注意的是输出的两个矩阵a和b,其中矩阵b为冗余矩阵,在如图两个分支的情况下b=1-a。
Select:
Select操作和SENet中的scale操作相似,不同的是select操作需要对两个权重矩阵做加权操作,然后加和输出最终向量Vc。即: