ResNeXt

ResNeXt 是 2017 年 FAIR 提出的一个图像分类网络。ResNeXt 是基于 ResNet 的整体结构提出的一种改进结构。 受启发于 Inception 模块“分离-变换-合并”的思路,把 ResNet 中 BottleNeck 模块中的 64 通道的卷积替换为独立的 32 路 4 通道卷积运算,并在最后按通道合并起来。 这也等价为将 ResNet 的 BottleNeck 结构中的第二个卷积层替换为分组卷积层。 这种修改在保持参数和计算量基本不变的情况下,进一步提高了网络分类精度。 ResNeXt 在 2016 年的 ILSVRC 竞赛图像分类项目中取得了第二名的成绩。

基本思路

ResNet 的 BottleNeck 结构如下图左图所示,其残差分支由三个卷积层串联而成,输入通道数、卷积核大小、输出通道数从左到右标注在图中。 这三个卷积层分别负责压缩特征图的通道数、扩展感受野以及恢复特征图的通道数。

可以看出,中间 3x3 的卷积层占据了主要的参数量。

经过这种改造后,残差分支的参数总量变为为

使用分组卷积实现多路残差

ResNeXt 中的多路残差结构可以由分组卷积实现。为了理解这一点,让我们先来看一下分组卷积是如何计算的。

如果我们将空间维度也考虑进去,则分组卷积的前传计算为:

分组卷积在 AlexNet 中就有所应用。受到当时 GPU 显存的限制,AlexNet 在实现时使用了模型并行的技术,将同一层的特征图按通道切分成两部分,分别放在不同的 GPU 上,即组数为 2 。 在前传时,只有中间一个卷积层和最后的两个全连接层是全连接的,需要 GPU 间进行数据通信,其余卷积层均为组数为 2 的分组卷积,即使用各自 GPU 上的通道数减半的卷积核。

接下来,我们再考察如何使用分组卷积实现 ResNeXt 的多路残差结构。 辅助论文中的图示可以更好的理解。

经过这种替换,ResNeXt 的多路残差结构就可以等效变换为一个单路结构。这也是诸多深度学习框架所采用的实现方式。

ResNeXt 的 PyTorch 实现

由于 ResNeXt 的整体结构与 ResNet 完全相同,只要将残差分支中的普通卷积替换为分组卷积即可。由于 Pytorch 的 Conv2d类型直接支持了group参数,因此基于 ResNet 的代码实现 ResNeXt 是非常直接的。

在 torchvision 中,ResNeXt 也实现在 resnet.py 中,传入匹配的groupwidth参数给工厂函数_resnet,就可以实现分组卷积。

在 mmclassification 中,ResNeXt 实现在一个单独的文件 resnext.py 中。与 torchvision 不同 mmclassification 通过继承 ResNet 的 BottleNeck 残差模块和 ResNet 结构,在增加了对分组卷积的实现。

Last updated