Resnest:注意力+分組卷積的融合


ResNeSt是亞馬遜的李沐團隊的paper,最近在各個任務上刷榜了,但卻被ECCV2020

strong reject了,在知乎上也是引起了熱議,據李沐說這個網絡花了一百萬刀!我看完

以后感覺是ResNeXt +  SKNet的組合,訓練網絡的很多tricks在工程上還是很有意義

的。

討論:https://www.zhihu.com/question/388637660

 

ResNeXt

         何凱明團隊提出,非常的簡單:將resnet中3*3的卷積,替換為分組卷積。然后就

沒有了。。。。說實話就這個點換我是發不出來paper的,可見講好故事有多重要。

         論文里增加了一個cardinality(就是group),並討論了相較於增加網絡的寬度

和深度,簡單的增加group會更好。一句話就是,split-transform-merge。

 

          網絡結構如圖

             

        實現就更簡潔了  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)。網絡搜索沒做過,就說下幾個有意思的結論吧

    1、通過activations(不是激活函數),而不是flops來衡量速度。這也是這篇paper吸引我的地方,

參考https://zhuanlan.zhihu.com/p/122943688

    2、swish在小模型上更好,relu更適合大模型(更多flops)。尤其是使用depthwise conv + swish,

效果比dc+relu更好。

    

實現可參考https://github.com/signatrix/regnet

 

        

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM