Torch 版代码:https://github.com/facebookresearch/ResNeXt
Caffe 版代码:https://github.com/soeaver/caffe-model/tree/master/cls/resnext
Caffe 代码可视化工具:http://ethereon.github.io/netscope/#/editor
Research on visual recognition is undergoing a transition from “feature engineering” to “network engineering”.
Inception famliy 带来的启发是 split-transform-merge
作者说 inception family carefully designed topologies are able to achieve compelling accuracy with low theoretical complexity(哈哈哈哈哈哈哈)
Inception 有太多超参数要去 design 了
这样会导致 it is in general unclear how to adapt the Inception architectures to new datasets / tasks
作者在 inception 的基础上,采用 VGG / ResNet’s strategy of repeating layers,利用组卷积的思想(split-transform-merge strategy),提出了 ResNext。结构设计更加规范!
1)提出了 ResNext 结构
2)将 group convolution 发扬光大(split-transform-aggregate)
ImageNet-5K set 是 5000 classes,要知道,resnet 相当爆炸了,出来的时候几乎横扫了视觉任务竞赛的榜单!这个比 resnet 效果还好!
increasing cardinality is a more effective way of gaining accuracy than going deeper or wider
注意文中的 width 指的是 number of channels(a group),deep 指的是 number of layers
1)思想起源
传统的 fully connection
X = [ x 1 , x 2 , . . . , x D ] X = [x_1, x_2, ..., x_D] X=[x1,x2,...,xD] is a D-channel input vector
第一步 X X X split 成 a low-dimensional embedding x i x_i xi
第二步 transform, w i x i w_ix_i wixi
第三步 aggregate, ∑ 1 D \sum_{1}^{D} ∑1D
合起来 ∑ i = 1 D w i x i \sum_{i=1}^{D}w_{i}x_{i} i=1∑Dwixi
2)移花接木
引用到 convolution 2D(split-transform-aggregate)
作者将 fc 的结构升华下,定义 aggregated transformation 结构如下:
C 表示 cardinality,也即 number of groups, τ i \tau_i τi should project x x x into an (optionally low-dimensional) embedding and then transform it.(关于 low-dimensional embedding 的理解参考 深度学习中 Embedding层两大作用的个人理解)
parameters(差不多)
3)三种等价的形式
We have trained all three forms and obtained the same results.(选(c)因为 more succinct and faster)
parameters
(a) 256 ∗ 4 ∗ 32 + 4 ∗ 3 ∗ 3 ∗ 4 ∗ 32 + 4 ∗ 256 ∗ 32 = 70144 256*4*32 + 4*3*3*4*32 + 4*256*32 = 70144 256∗4∗32+4∗3∗3∗4∗32+4∗256∗32=70144
(b) 256 ∗ 4 ∗ 32 + 4 ∗ 3 ∗ 3 ∗ 4 ∗ 32 + 128 ∗ 256 = 70144 256*4*32 + 4*3*3*4*32 + 128*256 = 70144 256∗4∗32+4∗3∗3∗4∗32+128∗256=70144
(c) 256 ∗ 128 + 128 / 32 ∗ 3 ∗ 3 ∗ 128 / 32 ∗ 32 + 128 ∗ 256 = 70144 256*128 + 128/32*3*3*128/32*32 + 128*256 = 70144 256∗128+128/32∗3∗3∗128/32∗32+128∗256=70144
因为都是三层,每层的 resolution 都一样,所以同 parameters 的话,也同计算量!(c)结构比(a),(b)结构看上去简洁很多,作者后续的设计都是采用的(c)结构
4)趋利避害
figure 3 (c) 的结构,depth 要 ≥ 3 \geq 3 ≥3,why
parameters
可以看出,如果 depth = 2,和普通的两层卷积等价,no sense!
两个设计准则:
1)分辨率一样,block 的参数都一样,
2)分辨率减半, channles 翻倍
第二条设计准则并不陌生,在 resnet 论文中也有见过,此文的解释也如出一辙,The second rule ensures that the computational complexity, in terms of FLOPs (floating-point operations, in # of multiply-adds), is roughly the same for all blocks.
1)关于 cardinality 和 width 的理解
C C C 为 cardinality,也即是 number of groups,
d = 4 d = 4 d=4 表示 w i d t h = 4 width=4 width=4,也即每组的 channels 为 4 dimension
C ∗ d = f i l t e r s C*d = filters C∗d=filters(见 table 2),值得注意的是,这里的 filters 仅仅指的是第一个 bottleneck block 的 filters(上例子中 32 ∗ 4 = 128 32*4 =128 32∗4=128),因为其它 bottleneck block 的 filters 都可以根据 128 结合两个设计准则推导出来。
这里一定要辨别清楚。不然你会懵圈,后面 C = 32 不变, d d d 还等于4的话,256,512,1024 就解释不通了,这里我困惑了很久!
2)关于 residual connection(shortcut) 的细节
resnext 采用的 shorcut 结构为 resnet-B
same resolution | down sampling | |
---|---|---|
resnet-A | identity | zero padding |
resnet-B | identity | conv(stride=2) |
resnet-C | conv(stride=1) | conv(stride=2) |
convolution 也可以叫做 a liner projection(mapping)
3)stride = 2 在 bottleneck block 哪层卷积?
bottleneck block 像个夹心饼干,前后两个 1 ∗ 1 1*1 1∗1 卷积,中间一个 group convolution,如果 resolution 降低,那层用 stride = 2 呢? 看了下代码 https://github.com/soeaver/caffe-model/tree/master/cls/resnext ,stride =2 用在 group convolution 那层,重复的 bottleneck block 中,第一个bottleneck block负责 down sampling!
从 C(cardinality)和 d(width)两个角度来做实验!
solo resnet(ImageNet 1K)
C 和 d 的设计原则,preserved complexity,多 C 更有效(没有必要更多的组,acc 饱和了)
Cardinality:分的组更多
Deeper:网络的layers更多
Wider:每组的 channels 更多
结论:increasing cardinality C shows much better results than going deeper or wider、
注意:ResNeXt-101 结果比 ResNet-200 还好(half complexity),侧面说明了 cardinality is a more effective dimension than depth and width
比 ResNet 强,比 inception famliy 设计的更规范和容易,第一次把 group convolution 用来提升精度!弄清楚 cardinality 和 width 的关系!弄清楚作者说的 low-dimensional embedding!