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更好。