衆所周知,現在很多網絡都是cell組成的,最常用的就是resblock,我想好好研究研究
目錄
最開始,kaiming提出resblock是爲了分類問題,作爲cv最基礎的問題,無疑其他domain也紛紛借鑑,以resblock爲cell的網絡結構鋪天蓋地席捲而來…
1.最開始的resblock
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 簡單的推導
簡單解釋一下爲什麼這麼做梯度不會消失。定義是深度L層的單元,loss function是。
根據鏈式法則,loss function回傳到第L層可以拆解成兩項:
和。
- 可以保證loss function可以返回第L層。
- 在一個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,不同層次特徵都連上,效果肯定提高了。但是這玩意顯存佔用就沒法提了(因爲有點多)