Res-Net: Resblock與其變體的討論

衆所周知,現在很多網絡都是cell組成的,最常用的就是resblock,我想好好研究研究

最開始,kaiming提出resblock是爲了分類問題,作爲cv最基礎的問題,無疑其他domain也紛紛借鑑,以resblock爲cell的網絡結構鋪天蓋地席捲而來…

1.最開始的resblock

resblock1

2.resblock 進化

BatchNorm/InstanceNorm/…Norm出現的時候,basic block最常用的就是Conv+BN+Relu+Conv+BN 模式側邊分支的模式,一定要記住的是,側邊分支最後一個一定不能是relu,殘差塊殘差塊,有正有負才能修復identity(identity就是下圖灰色的箭頭中的線)。
·在這裏插入圖片描述

之後有文章對上面結構做出改進,準確的說是改變了模塊順序。得到修正後的basick block模塊如下。
在這裏插入圖片描述

爲什麼新的結構好那?作者推導了公式(下面有推導),證明這樣子在backward的時候梯度可以完全往回傳導,所以這樣子纔是最佳的resblock。
其次,隨着BN/IN等在high-level裏的活躍,dropout慢慢淡出了人們視野,畢竟都是正則,前者主流,但是仍然有人往裏面增加dropout,尤其是生物醫學圖像數據集(更容易過擬合),所以大家把各種正則手段都拿了出來(個人愚見…)。

2.1爲什麼新的block可以work?

在kaiming的Identity Mappings in Deep Residual Networks中,有一幅圖展示了哪種resblock比較好,下圖是在CIFAR-10上使用1001-layer ResNets的結果。可以看到新的unit是的resnet更加容易訓練。

在這裏插入圖片描述

2.2 簡單的推導


簡單解釋一下爲什麼這麼做梯度不會消失。定義xLx_L是深度L層的單元,loss function是ϵ\epsilon
在這裏插入圖片描述
根據鏈式法則,loss function回傳到第L層可以拆解成兩項:
ϵxL\frac{\partial \epsilon}{x_L}ϵxL(ϵxLi=ll1F)\frac{\partial \epsilon}{x_L} (\frac{\partial \epsilon}{x_L} \sum_{i=l}^{l-1} \mathcal {F})

  • ϵxL\frac{\partial \epsilon}{x_L}可以保證loss function可以返回第L層。
  • ϵxL(ϵxLi=ll1F)\frac{\partial \epsilon}{x_L} (\frac{\partial \epsilon}{x_L} \sum_{i=l}^{l-1} \mathcal {F})在一個mini-batch中不總是爲-1。所以loss function回傳到第L層的梯度不會爲0。(論文沒解釋爲什麼不總是爲-1,有點疑惑

2.3 identify的重要性

在這裏插入圖片描述
還是Identity Mappings in Deep Residual Networks這個論文。kaiming嘗試了不同的組合(美觀期間沒有畫出BN)。
這裏有個非常重要的結論:identify那條線非常重要,謹慎修改,注意就連上面放一個1x1的conv都會大幅度削減error!(但是放一個1x1的conv情況下resnet34效果卻有提升。。所以實驗結論是block數目變多後,放一個1x1的conv在identify上效果變差)
在這裏插入圖片描述
Note:上表驗證了圖中6種組合的性能,實驗在CIFAR-10 test set,使用了ResNet-110

2.4 BN/ReLU的順序?

在這裏插入圖片描述
還是Classification error (%) on the CIFAR-10 test set 。最好的方式是圖中e。
請大家務必細品上圖/表!!!

2.5 常用的特徵提取模塊

一般常用的有ResNet18,ResNet34,ResNet50,ResNet101,ResNet152,這些結構經常用來進行特徵提取,比如deeplabv3+encoder中就使用了ResNet101作爲backbone。kaiming這幾種特徵提取網絡,網絡越深,效果自然越好。
在這裏插入圖片描述
這是原文中,分類問題的結構與網絡FLOPs。一般torch等框架裏包含有相應模塊。

3 ResNeXt的出現

經歷了Res-Net的成功,kaiming在2017cvpr上提出了其改進版ResNeXt(論文名:Aggregated Residual Transformations for Deep Neural Networks)。後面的四個字母是next,表示下一個的意思。

3.1 引入cardinality(基數)

在這裏插入圖片描述
對於resnet中的bottleneck,在channel維度上進行了分組,上圖中的cardinality是32,也就是分成32組channel數目更小的統一單元。細心的朋友就會發現,64 不等於 4x32啊,爲什麼這麼分?

因爲他們的計算量是近乎相同的。(卷積核如何計算參數量,詳見最近整理的一個博文——傳送門

  • 左圖是256 · 64+ 3 · 3 · 64 · 64+ 64 · 256 ≈ 70k
  • 右圖是C · (256 · d + 3 · 3 · d · d + d · 256),C = 32 and d = 4剛好差不多70k。
    就是這麼個意思。右圖也是本文的核心。

3.2 bottleneck/basicblock的改進

1.當depth>=3的時候:

在這裏插入圖片描述
如上圖,ResNeXt可以從三種角度去看,這三種是等效的我在圖上有一些註釋,總之請大家細品三幅圖。

2.當depth=2的時候,也就是BasicBlock:
在這裏插入圖片描述
此時,並不等效於分組卷積。因爲分組卷積in_channel 和 out_channel 都必須分組,大家看圖左,只有一端才分組(對比bottleneck那個圖b),所以BasicBlock無法改進。

3.3 改進後的提升

在這裏插入圖片描述
1x64d就是Res-Net的設置,32x4d就是上一章節的bottleneck設置,分成32組。

4.之後的Dense-net

然後就是denseblock了,其實我感覺就是連接更加dense,不同層次特徵都連上,效果肯定提高了。但是這玩意顯存佔用就沒法提了(因爲有點多)
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章