在年初ResNeSt刚出来的时候,就注意到这个,又是一个国人出品的屠榜架构。显然,这个架构也引起了很多争议,觉得这个论文只是一些技巧集合,不足以支撑一篇优秀论文,不过作为一个实用主义者,是不是优秀论文其实并不关注,只要效果够好,而且推断时间能在约束条件下。
前面写SENet和SKNet,现在终于可以写到ResNeSt。
1. ResNeXt结构
在开始ResNeSt之前,还是先再说一说ResNeXt。
这是16年底推出的网络结构,简单说就是将残差块和分组卷积叠加在一起,论文地址:https://arxiv.org/pdf/1611.05431.pdf
我们知道采用并联的方式连接电路有助于提升电路的稳定性,并联集成模型也能提升模型的效果,而分组卷积和它们类似,据说作者已经证明和验证了分组卷积是有接近于普通卷积的精度的(英语好的可以自己看)。
可以看作者的实验数据:
而ResNet50和ResNeXt50的参数和计算量都是差不多的:
C=32是分组数量。
2. SENet与SKNet:注意力机制的发展
SENet是18年,SKNet是19年,两者有一定的继承关系,都使用了注意力机制。
这是SENet的架构,它的中心思想就是对通道计算权重,达到强化重要特征,并弱化不重要的特征。
到了SKNet则进一步,在SENet的基础上,使用了多个不同size的卷积核来提取不同感受野的特征,类似于多分支上做继承学习。SKNet多少也有点ResNeXt的影子。
在有了SKNet之后,ResNeSt其实已经呼之欲出了。作者对此也进行比对:
Split Attention已经有拆分注意力的意思。
3. ResNeSt:拆分注意力网络
作者自己在B站发布了视频讲解该网络,还是中文的哦:https://www.bilibili.com/video/BV1PV411k7ch
总的来说,我觉得该架构就是ResNeXt,SENet和SKNet的集合体,在SKNet中已经使用了多个不同size的卷积核来提升效果,如果把ResNeXt的多分支结构嫁接过来,会怎么样呢?
我们先看其架构图:
这个图看着很复杂,其实就是三块:
3.1 Cardinal分组内的分离注意力结构
结构图如下:
注意这里的输入input的通道数是c=C/K,可以对比SKNet结构去理解。
按我的理解,这就是一个SKNet,只是它的卷积核是一样的。
3.2 ResNeSt Block
我总结一下其结构,应该是这样的:
如果把虚线部分看成是一个整体,这就是一个变形的SENet。
这里如果V的size跟input的Shape如果是相同的话,则
Output = V + Input
而如果Shape并不相同的话,则需要对Input进行一次变换:
Output = V + T(Input)
这里的变换可能是一次卷积运算,或者卷积和池化的组合运算。
4. Radix-major Split-Attention Block
在论文的后半部分,还有一个图Radix-major Split-Attention Block:
个人觉得这个图跟论文前面部分的图是有冲突的,而作者开源的代码跟这个图是比较接近的(感觉代码实现跟这个图也还是有差别的)。
但是如果这样的架构,是否还需要这么复杂呢?是否还需要分组使用两个超参数K和R呢,直接使用一个K是不是就可以了?
5. 小结
ResNeSt = ResNeXt + SENet + SKNet
暂时给我的感觉是,ResNeSt这个架构设计得有点复杂,有些结构好像是有点绕,感觉应该是可以简单一些的。例如,我觉得本来SKNet就已经包含了SENet的思想,现在又类似在SENet中嵌入SKNet,是否需要这么复杂?(或者我的理解有问题?)
关于ResNeSt,估计还需要再写一篇才行,论文里还包含很多训练技巧没有提到过。