原文链接:https://www.yuque.com/yahei/hey-yahei/typical_cnn#NY1oJ
SENet
论文:《Squeeze-and-Excitation Networks (CVPR2018)》
提出了SE模块,是注意力机制的一种应用,学习特征图上通道间的相关性,作为权重ReScale各个通道;SE模块相当于一个轻量级的插件,可以方便地插入到已有的网络中去。
SE模块深受研究者们的喜爱,可以看到后来的新网络都热衷于使用SE模块。但实际应用中,带有SE模块的网络在量化时容易出现明显的性能下降,目前似乎没有很好的解决方案。
(红框部分即为SE-Block)
SE-Block结构上非常简单,
首先对特征图做全局平均池化拉成维的向量,再经过两个FC层形成瓶颈结构(第一个FC收缩为维,第二个FC再扩增回维),第一个FC用ReLU激活,第二个FC用Sigmoid激活输出一系列0~1的权重对原始特征图进行ReScale操作。
其中是超参数,作者通过实验指出,取通常能取得比较好的结果(权衡计算量和性能提升)。
(SE-Inception和SE-ResNet)
(ImageNet上的实验结果)
SKNet
论文:《Selective Kernel Networks (CVPR2019)》
可以看作是SENet的一个改进,提出一个SK模块,与SE模块不同的是SK模块混合了两种大小的卷积核,以此获得不同感受野的特征信息。
(SK-Block)
SK-Block结构上也不复杂,
- 分别对特征图使用不同大小的卷积核进行特征提取(如图为3x3卷积核和5x5卷积核),分别得到
- 将逐元素相加得到
- 沿用SE-Block的思路,得到通道数为的权重向量(数值范围在0~1之间)
- 用去ReScale特征图,用去ReScale特征图,最后逐元素相加融合为,本质上相当于一个软选择
(ImageNet上的实验结果)
ResNeSt
论文:《ResNeSt: Split-Attention Networks (2020.04)》
代码:https://github.com/zhanghang1989/ResNeSt
(SA-Block)
SA-Block比SE-Block和SK-Block更复杂。
- Input1, ..., Input r是个相同输入,相同结构但不同参数的分支输出
- 将个输入相加后进行全局平均池化得到维向量
- 用一个FC将向量维度收缩为构造瓶颈,论文建议取(的含义参见后续ResNeSt Block的描述)
- 分别用个FC分别将向量维度扩增回,此时一共有个维向量
- 沿维度方向,对个维向量分别做softmax,作为权重去ReScale这组通道的特征图
可以把SA-Block看作是SK-Block的一个多分支版本(对应地,二分类sigmoid就被多分类softmax替代),本质也是为了从组通道中选择出合适的一个(软选择)。
(ResNeSt Block)
ResNeSt Block借鉴了ResNeXt的设计(看着复杂,实际可以用分组卷积简化实现)。
- 将通道的输入特征图沿着通道分成组,每组的输入通道数为
- 每组的输入又分成小组,分别经过各自的“1x1卷积收缩为通道,3x3卷积扩增回通道”,然后经过前述的SA-Block进行软选择,得到通道的输出
- 将组输出拼接在一块得到通道的输出,然后由1x1卷积变换到通道,与原始输入的短连接相加
(ImageNet上的实验结果)
论文只简单对FLOPS进行分析,实际上ResNeSt沿用了ResNeXt的分组卷积,要知道分组卷积的效率是比较低的,尽管表面上ResNeSt-50-fast跟ResNetD-50都是4.34GFLOPS,但ResNeSt-50-fast肯定还是要慢一些。我简单拿开源的Gluon模型在RTX2080Ti上跑了一下,ResNeSt-50的推理速度比ResNetD-101稍慢一些,而只有ResNetD-50的一半,fast版本尚未开源(截止到2020.04.20),不知道其实际效果会如何。