ResNeSt是亚马逊的李沐团队的paper,最近在各个任务上刷榜了,但却被ECCV2020 git
strong reject了,在知乎上也是引发了热议,据李沐说这个网络花了一百万刀!我看完github
之后感受是ResNeXt + SKNet的组合,训练网络的不少tricks在工程上仍是颇有意义网络
的。ide
讨论:https://www.zhihu.com/question/388637660函数
ResNeXt
何凯明团队提出,很是的简单:将resnet中3*3的卷积,替换为分组卷积。而后就spa
没有了。。。。说实话就这个点换我是发不出来paper的,可见讲好故事有多重要。code
论文里增长了一个cardinality(就是group),并讨论了相较于增长网络的宽度orm
和深度,简单的增长group会更好。一句话就是,split-transform-merge。blog
网络结构如图ci
实现就更简洁了 https://github.com/weiaicunzai/pytorch-cifar100/blob/master/models/resnext.py
C = CARDINALITY #How many groups a feature map was splitted into #"""We note that the input/output width of the template is fixed as #256-d (Fig. 3), We note that the input/output width of the template #is fixed as 256-d (Fig. 3), and all widths are dou- bled each time #when the feature map is subsampled (see Table 1).""" D = int(DEPTH * out_channels / BASEWIDTH) #number of channels per group self.split_transforms = nn.Sequential( nn.Conv2d(in_channels, C * D, kernel_size=1, groups=C, bias=False), nn.BatchNorm2d(C * D), nn.ReLU(inplace=True), nn.Conv2d(C * D, C * D, kernel_size=3, stride=stride, groups=C, padding=1, bias=False), nn.BatchNorm2d(C * D), nn.ReLU(inplace=True), nn.Conv2d(C * D, out_channels * 4, kernel_size=1, bias=False), nn.BatchNorm2d(out_channels * 4), )
为何如此简单的改变,效果就会好呢?paper里也论证了,其实就是分组卷积带
来的增益,个人理解是分组卷积,提取出了更好的特征,知乎上也有讨论 https://www.zhihu.com/question/323424817
SKNet
SENet的升级版,连名字都是致敬。话说SENet真是个好东西,用过都说好。
直接上图,能够看出,论文使用了多路分支来作attention。一路为3*3,一路为5*5(其实用的是3*3的空洞卷积来代替),
注意:两路用的都是分组卷积(resnxt的作法)。而后两路直接融合(elementwise),而后一块儿去作SE,再将attention拆分,
分别去对上面的两路作attention。注意:一块儿通过softmax后,两者attention相加为1。最后将attention以后的结果再作融合。
caffe的网络结构:https://github.com/implus/SKNet/blob/master/models/sknet50.prototxt
做者在知乎上的文章:https://zhuanlan.zhihu.com/p/59690223
ResNeSt
终于来到了正主。先来一组对比图。能够看出,各组网络的核心区别,仍是在split attention上。
split attention模块。首先将各分组作融合,而后是SE: GP+FC1+FC2。注意:和sknet同样,这里都是用conv1*1来代替fc,
可是resnest用的是组卷积,而后对组卷积作rsoftmax(按组来作softmax)获得attention,最后去作融合。看到这里,我以为
确实和sknet很像,做者本人也认可了这点,能够说sknet是resnest的一个特例。
https://www.zhihu.com/question/388637660
核心代码https://github.com/zhanghang1989/ResNeSt/blob/master/resnest/torch/splat.py
RegNet
最后说一说regnet,也是何凯明团体提出,使用的是搜索的网络,对标的是谷歌家的EfficientNet,
搜索的是ResNeXt(搜索包括了group)。网络搜索没作过,就说下几个有意思的结论吧
一、经过activations(不是激活函数),而不是flops来衡量速度。这也是这篇paper吸引个人地方,
参考https://zhuanlan.zhihu.com/p/122943688。
二、swish在小模型上更好,relu更适合大模型(更多flops)。尤为是使用depthwise conv + swish,
效果比dc+relu更好。