經(jīng)典分類CNN模型系列其八:ResNeXt

介紹

越來越喜歡Facebook的東西了,雖然很久以來我一直是個Google產(chǎn)品及技術的忠實粉絲。但最近在AI框架上一直頻繁去翻弄Pytorch/Caffe2,感覺其API及核心模塊設計結(jié)構(gòu)比Tensorflow更加清晰、易懂。
同時看到Facebook出的像ResNext這種分類網(wǎng)絡比Google一直在捧的Inception v4/Inception Resnet v2等網(wǎng)絡也要更為簡單而高效。

本來始終都不能從Inception v4/Inception Resnet系列網(wǎng)絡的復雜噩夢中解脫,但看過ResNeXt后,終于如釋重負,恢復了自己一直以來的哲學信仰。這個世界的很多高深、有效的道理其實都可以有簡單的方式去表達。

ResNeXt可以說是基于Resnet與Inception 'Split + Transfrom + Concat'而搞出的產(chǎn)物,結(jié)構(gòu)簡單、易懂又足夠強大。在行業(yè)標志性的Imagenet 1k數(shù)據(jù)集上它取得了比Resnet/Inception/Inception-Resnet系列更佳的效果。

以下為構(gòu)成ResNeXt網(wǎng)絡的基本block單元。

ResNeXt與Resnet基本模塊對比

乍看上去它與Inception Resnet中所有的基本單元極為相似,可實際上它block當中的每個sub branch都是相同的,這是它與IR網(wǎng)絡結(jié)構(gòu)的本質(zhì)區(qū)別,而正是基于這區(qū)別,我們可以使用Group convolution來對其進行良好實現(xiàn)。

ResNeXt

ResNeXt網(wǎng)絡的整體結(jié)構(gòu)

正如ResNet是由基本的Residual模塊一個個累積起來的一樣,ResNeXt網(wǎng)絡也是由上圖中所描述的模塊一個個累積起來的。下面表格當中,我們能看到ResNeXt與ResNet網(wǎng)絡的整體結(jié)構(gòu)。

ResNext-50與Resnet-50的整體網(wǎng)絡結(jié)構(gòu)對比

在這里它Follow了之前VGG/ResNet等網(wǎng)絡中的一貫做法:一是如果一個block輸出同樣大小的chnnel size,那么blocks輸入、輸出有著相同的hyper-parameters(即width和filter sizes);二是若其輸出與輸入有著不同的大小(如downsampling操作),那么就需要相應地擴大filters的數(shù)目。
從上面表格里,亦能看出ResNeXt與ResNet一樣都follow這樣兩條準則以保證每個block的計算量類似,所傳遞的信息也不會因?qū)訑?shù)遞增而有太多丟失。

ResNeXt網(wǎng)絡模塊的變形

下面圖中顯示了三種ResNeXt網(wǎng)絡模塊的變形。它們在數(shù)學計算上是完全等價的,而第三種包含有Group convolution操作的正是最終ResNeXt網(wǎng)絡所采用的操作。

ResNeXt網(wǎng)絡模塊的三種等價形式

ResNeXt網(wǎng)絡的Capacity

一般增強一個CNN的表達能力有三種手段:一是增加網(wǎng)絡層次即加深網(wǎng)絡(目前CNN已經(jīng)由最初Alexnet的不到十層增加到了成百上千層,而實際實驗結(jié)果表明由層次提升而帶來的邊際準確率增加已是越來越少);二是增加網(wǎng)絡模塊寬度(可見我們之前有介紹過的Wide residual network,可寬度的增加必然會帶來指數(shù)級的參數(shù)規(guī)模提升,因此它并非為主流CNN設計所認可。);
三是改善CNN網(wǎng)絡結(jié)構(gòu)設計(當然在不增加模型復雜度的情況下通過改良模型設計以來提升模型性能是最理想的做法,不過其門檻則實在是太高,不然Google/Facebook/Microsoft的那些埋頭設計網(wǎng)絡/調(diào)參的哥們兒就沒辦法拿那么高工資了。:))。

ResNeXt的做法可歸為上面三種方法的第三種。它引入了新的用于構(gòu)建CNN網(wǎng)絡的模塊,而此模塊又非像過去看到的Inception module那么復雜,它更是提出了一個cardinatity的概念,用于作為模型復雜度的另外一個度量。Cardinatity指的是一個block中所具有的相同分支的數(shù)目。

作者進行了一系列對比實驗,有力證明在保證相似計算復雜度及模型參數(shù)大小的前提下,提升cardinatity比提升height或width可取得更好的模型表達能力。

下圖為反映Cardinatity增加對模型性能提升的實驗結(jié)果。

Cardinatity增加對模型性能提升的影響

實驗結(jié)果

ImageNet-1K

首先在標準的ImageNet-1K上進行了實驗,并與其它state-of-art的模型進行了對比。

ResNeXt與ResNet網(wǎng)絡在ImageNet-1K數(shù)據(jù)集上的性能對比

可以看出ResNeXt網(wǎng)絡相對于ResNet網(wǎng)絡可在training accuracy/val accuracy上都取得提升,但training accuracy上的提升顯得更大。作者分析認為是因為ResNeXt的表達能力更強了,但此類結(jié)果改善卻并非是因為Regularization的因素導致的。
為了減少可能的overfitting以來有效利用ResNext的表達能力,作者還試著在更大的ImageNet-5K上進行了實驗。

下表為ResNeXt與更多CNN網(wǎng)絡在ImageNet-1K上的結(jié)果比較。

ResNeXt與其它CNN網(wǎng)絡在ImageNet-1K上的結(jié)果比較

ImageNet-5K

下面的圖與表格中反映了ResNeXt與ResNet相比在更大的ImageNet-5K數(shù)據(jù)集上的優(yōu)勢。

ResNeXt與ResNet網(wǎng)絡在ImageNet-5K上的結(jié)果比較

代碼分析

原文的代碼是基于Torch來完成的,因為此Framework已經(jīng)不再維護,所以在這里還是通過由Caffe所表達的結(jié)構(gòu)來分析下此模型的組成。

下面是一個典型的ResNeXt網(wǎng)絡模塊,可以與之前的ResNet模塊對比下,其主要的區(qū)別就是中間的3x3 conv transform層由direct conv變?yōu)榱薱ardinatity為32的group conv。

layer {
  name: "stage1_unit2_conv1"
  type: "Convolution"
  bottom: "stage1_unit1_plus"
  top: "stage1_unit2_conv1"
  convolution_param { 
     num_output: 128
     kernel_size: 1
     stride: 1
     pad: 0
     bias_term: false
  }
}

layer {
  name: "stage1_unit2_bn1"
  type: "BatchNorm"
  bottom: "stage1_unit2_conv1"
  top: "stage1_unit2_conv1"
  batch_norm_param {
    use_global_stats: true
    eps: 2e-5
  }
}

layer {
  name: "scale_stage1_unit2_bn1"
  bottom: "stage1_unit2_conv1"
  top: "stage1_unit2_conv1"
  type: "Scale"
  scale_param {
        bias_term: true
  }
}

layer {
  name: "stage1_unit2_relu1"
  type: "ReLU"
  bottom: "stage1_unit2_conv1"
  top: "stage1_unit2_conv1"
}

layer {
  name: "stage1_unit2_conv2"
  type: "Convolution"
  bottom: "stage1_unit2_conv1"
  top: "stage1_unit2_conv2"
  convolution_param { 
     num_output: 128
     kernel_size: 3
     stride: 1
     group: 32
     pad: 1
     bias_term: false
  }
}

layer {
  name: "stage1_unit2_bn2"
  type: "BatchNorm"
  bottom: "stage1_unit2_conv2"
  top: "stage1_unit2_conv2"
  batch_norm_param {
    use_global_stats: true
    eps: 2e-5
  }
}

layer {
  name: "scale_stage1_unit2_bn2"
  bottom: "stage1_unit2_conv2"
  top: "stage1_unit2_conv2"
  type: "Scale"
  scale_param {
        bias_term: true
  }
}

layer {
  name: "stage1_unit2_relu2"
  type: "ReLU"
  bottom: "stage1_unit2_conv2"
  top: "stage1_unit2_conv2"
}

layer {
  name: "stage1_unit2_conv3"
  type: "Convolution"
  bottom: "stage1_unit2_conv2"
  top: "stage1_unit2_conv3"
  convolution_param { 
     num_output: 256
     kernel_size: 1
     stride: 1
     pad: 0
     bias_term: false
  }
}

layer {
  name: "stage1_unit2_bn3"
  type: "BatchNorm"
  bottom: "stage1_unit2_conv3"
  top: "stage1_unit2_conv3"
  batch_norm_param {
    use_global_stats: true
    eps: 2e-5
  }
}

layer {
  name: "scale_stage1_unit2_bn3"
  bottom: "stage1_unit2_conv3"
  top: "stage1_unit2_conv3"
  type: "Scale"
  scale_param {
        bias_term: true
  }
}

layer {
  name: "stage1_unit2_plus"
  type: "Eltwise"
  bottom: "stage1_unit1_plus"
  bottom: "stage1_unit2_conv3"
  top: "stage1_unit2_plus"
  eltwise_param {
     operation: SUM
  }
}

layer {
  name: "stage1_unit2_relu"
  type: "ReLU"
  bottom: "stage1_unit2_plus"
  top: "stage1_unit2_plus"
}

參考文獻

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容