ResNeXt:https://arxiv.org/pdf/1611.05431.pdf
keras代码:https://github.com/keras-team/keras-applications/blob/master/keras_applications/resnext.py
pytorch 代码:https://github.com/prlz77/ResNeXt.pytorch
1 简介
深度学习的其他网络为了提高准确率,都是采用增加网络深度或者网络宽度(其实指卷积中滤波器的个数)的方式,但这会增加模型的复杂度和参数量。为此作者在原有ResNet 的基础上,提出一种新的残差单元,在保持现有网络的参数量的前提下提高了模型的准确率。该网络结构名为ResNeXt。作者主要借鉴了VGG和Inception网络的思想,VGG在设计时采用堆叠的方式,同一模块中的像filter_size, filter_channel等超参数都保持一致; Inception网络采用split-transform-merge 策略,首先利用1×1卷积将输入映射到嵌入空间,之后再利用像3×3、5×5等卷积对嵌入空间的特征进行转换,最后将不同分支的特征利用concatenation进行融合。但是Inception网络每个分支的超参数较多,需要进行特别的设计。因此,作者借鉴了VGG堆叠的思想和Inception网络split-transform-merge 的结构,在增加准确率的同时基本不改变或降低模型的复杂度。结构如图1所示。
提出的残差单元与Inception的结构类似,但是该结构每个分支的超参数都是相同的,相当于进行了一个横向的堆叠,这样可以避免繁重的超参数调节工作。其中作者称分支的数量(图中为32)为 cardinality, 文中解释为 the size of the set of transformations, 作者也在实验中证明了增加cardinality比增加网络的深度和宽度更加有效。
2 提出的残差单元
思路:
对于一个简单的神经元,其计算过程可以用如下公式表示, 输入 x x x是一个 D D D维的向量。如图1所示, 可以看出神经元的计算过程就是一个split-transform-merge的策略,它首先将输入split到一个低纬度的嵌入式空间,然后利用简单的缩放: w i x i w_{i}x_{i} wixi对低纬度的嵌入式 特征进行transform,最后利用 ∑ i = 1 D \sum_{i=1}^{D} ∑i=1D将嵌入特征进行整合。作者借鉴该模板,提出的block可以用公式2进行表示,式中 T i \mathcal{T}_{i} Ti可以是一个任意的函数, C C C为cardinality, C C C可以不等于 D D D,可以为任意数字,同时作者在设计时保证了 T i \mathcal{T}_{i} Ti是相同的, T i \mathcal{T}_{i} Ti采用了如图1右面所示的bottleneck-shaped的结构,公式2可以改写为公式3。与Inception-ResNet不同的是这里在每个分支采用了相似的结构。
∑ i = 1 D w i x i ( 1 ) \sum_{i=1}^{D} w_{i} x_{i} \text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }\text{ }(1) i=1∑