ResNeXt是ResNet和Inception的结合体.ResNeXt借鉴Inception的“分割-变换-聚合”策略(即split-transform-merge),不同于Inception 的是,ResNext不需要人工设计复杂的Inception结构细节,而是每一个分支都采用相同的拓扑结构。ResNeXt的本质是分组卷积(Group Convolution),通过引入基数(Cardinality)来控制分组的数量
1 split-transform-merge策略
2 简化Inception
Inception是一个非常明显的“split-transform-merge”结构,作者认为Inception不同分支的不同拓扑结构的特征有非常刻意的人工雕琢的痕迹,而往往调整Inception的内部结构对应着大量的超参数,这些超参数调整起来是非常困难的。
所以作者的思想是每个结构使用相同的拓扑结构,那么这时候的Inception(这里简称简化Inception)表示为
3 ResNeXt的block结构
结合强大的残差网络,我们得到的便是完整的ResNeXt中的block结构,也就是在简化Inception中添加一条short-cut,表示为:
下图的左半部分就是ResNeXt中的Block结构,右半部分是Inception的Block结构。观察两个Block结构,最本质的差别,其实是Block内每个分支的拓扑结构,Inception为了提高表达能力/结合不同感受野,每个分支使用了不同的拓扑结构。而ResNeXt则使用了同一拓扑的分支,即ResNeXt的每个分支采用了相同的同拓扑结构
在上图ResNeXt中的Block结构中,输入部分是的256通道的特征图,然后将其分成32个分支,每个分支的第一个卷积层的输入通道数是256,卷积核大小是1x1,输出通道是4,每个分支的第二个卷积层的输入通道数是4,卷积核大小是3x3,输出通道是4,每个分支的第三个卷积层的输入通道数是4,卷积核大小是1x1,输出通道是256,然后将这32个分支的输出特征图进行逐点相加。最后再通过短连接将相加的结果和输入部分再进行相加下面我们分析一下ResNeXt中的Block结构中的 “split-transform-merge”过程,如下图所示;
也就是说,如果只看每个Block中单独的支路(Branch),其实是一个常见的“降维→变换→升维”的Bottleneck结构。但是,若以“分割-变换-聚合”的角度考虑,那么第一个1*1conv的“降维”,实际上也是把输入分给基数(这里C=32)个低维嵌入的过程。
其实上图可以等价于下面更简单的表达:
再进一步化简,上图最终等价于下面更简单的形式:在下图中,输入部分是一个256通道的特征图,第一个卷积层的输入通道是256,卷积核尺寸是1x1,输出通道是128,该卷积层将输入部分由256通道降维到128通道,第二个卷积层采用了分组卷积结构,它的输入通道数是128,卷积核尺寸是3x3,输出通道数是128,这里的参数group就是分组数,也就是前边所提的基数(Cardinality)。所以平分到每个 分组卷积层 的输入输出 通道数 都是。分组卷积层的作用是将第一个卷积层的输出特征图分组32个部分,使用分组卷积分别对每个部分分别进行卷积操作。第三个卷积层的输入通道是128,卷积核是1x1,输出通道数是256,该卷积层的作用是对前一层的分组卷积层的结果进行升维,将通道由128升维到256。最后将输入部分和第三个卷积层的输出部分进行相加得到最终结果
4 ResNeXt和ResNet的对比
其实ResNeXt和ResNet的最本质的区别在于其中使用新的block替换后者中的block(特指ResNet中的瓶颈模块,即Bottleneck)
注意:在ResNet18和在ResNet32中,它的block结构如下图所示,该block结构的网络层数只有2层,而在ResNeXt论文的作者认为,只有网络层数大于等于3,做上述变换才有意义。
比如在下图所示,假设我们对ResNet18或ResNet32中的block进行上述变换,那么它最终得到等价于下图最右半部分,它仍然是由两层卷积层组成的残差块,所以该变换没有任何意义
下图是ResNet50和ResNeXt50的参数表:
ResNeXt和ResNet在相同计算量情况下,前者的错误率更低,如下图所示;