ResNet總結及啓發

經典分類網絡,分類網絡總目錄(傳送門)

1、LeNet結構解析

2、AlexNet論文翻譯AlexNet論文總結與實現

3、VGG論文翻譯VGGNet總結及啓發

4、ResNet論文翻譯ResNet總結及啓發

5、Inception-v1Inception-v2

1、問題引入

隨着網絡的加深,出現了訓練集準確率下降的現象,我們可以確定這不是由於Overfit過擬合造成的(過擬合的情況訓練集應該準確率很高);所以作者針對這個問題提出了一種全新的網絡,叫深度殘差網絡,它允許網絡儘可能的加深。

殘差指的是什麼?

其中ResNet提出了兩種mapping:一種是identity mapping,指的就是圖1中”彎彎的曲線”,另一種residual mapping,指的就是除了”彎彎的曲線“那部分,所以最後的輸出是 [Math Processing Error],y=F(x)+x

identity mapping顧名思義,就是指本身,也就是公式中的[Math Processing Error]x,而residual mapping指的是“差”,也就是[Math Processing Error]y−x,所以殘差指的就是[Math Processing Error]F(x)部分。

如果網絡已經到達最優,繼續加深網絡,residual mapping將被push爲0,只剩下identity mapping,這樣理論上網絡一直處於最優狀態了,網絡的性能也就不會隨着深度增加而降低了。

2、ResNet思想

作者根據輸入將層表示爲學習殘差函數。實驗表明,殘差網絡更容易優化,並且能夠通過增加相當的深度來提高準確率。核心是解決了增加深度帶來的副作用(退化問題),這樣能夠通過單純地增加網絡深度,來提高網絡性能

1)作者在ImageNet上實驗了一個152層的殘差網絡,比VGG深8倍,取得了3.57%的錯誤率。作者通過一系列實驗證明了表示的深度(即網絡的深度)對很多視覺識別任務都至關重要。

2)僅僅由於使用了非常深的網絡,作者就在COCO目標檢測數據集上獲得了28%的相對提升

3、ResNet結構

3.1、resnet模塊

用了一種連接方式叫做“shortcut connection”,顧名思義,shortcut就是“抄近道”的意思,看下圖我們就能大致理解:

兩種resnet模塊:

這兩種結構分別針對ResNet34(左圖)和ResNet50/101/152(右圖),一般稱整個結構爲一個”building block“。其中右圖又稱爲”bottleneck design”,目的一目瞭然,就是爲了降低參數的數目,第一個1x1的卷積把256維channel降到64維,然後在最後通過1x1卷積恢復,整體上用的參數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的話就是兩個3x3x256的卷積,參數數目: 3x3x256x256x2 = 1179648,差了16.94倍。

對於常規ResNet,可以用於34層或者更少的網絡中,對於Bottleneck Design的ResNet通常用於更深的如101這樣的網絡中,目的是減少計算和參數量(實用目的)。

如圖1所示,如果F(x)和x的channel個數不同怎麼辦,因爲F(x)和x是按照channel維度相加的,channel不同怎麼相加呢?

針對channel個數是否相同,要分成兩種情況考慮,如下圖:

圖3 兩種Shortcut Connection方式

如圖3所示,我們可以清楚的”實線“和”虛線“兩種連接方式, 實線的的Connection部分(”第一個粉色矩形和第三個粉色矩形“)都是執行3x3x64的卷積,他們的channel個數一致,所以採用計算方式:

[Math Processing Error],y=F(x)+x

虛線的的Connection部分(”第一個綠色矩形和第三個綠色矩形“)分別是3x3x64和3x3x128的卷積操作,他們的channel個數不同(64和128),所以採用計算方式:

[Math Processing Error],y=F(x)+Wx

其中W是卷積操作,用來調整x的channel維度的。

3.2、ResNet50和ResNet101

這裏把ResNet50和ResNet101特別提出,主要因爲它們的出鏡率很高,所以需要做特別的說明。給出了它們具體的結構:

首先我們看一下表2,上面一共提出了5中深度的ResNet,分別是18,34,50,101和152,首先看錶2最左側,我們發現所有的網絡都分成5部分,分別是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之後的其他論文也會專門用這個稱呼指代ResNet50或者101的每部分。

拿101-layer那列,我們先看看101-layer是不是真的是101層網絡,首先有個輸入7x7x64的卷積,然後經過3 + 4 + 23 + 3 = 33個building block,每個block爲3層,所以有33 x 3 = 99層,最後有個fc層(用於分類),所以1 + 99 + 1 = 101層,確實有101層網絡;

注:101層網絡僅僅指卷積或者全連接層,而激活層或者Pooling層並沒有計算在內;

這裏我們關注50-layer和101-layer這兩列,可以發現,它們唯一的不同在於conv4_x,ResNet50有6個block,而ResNet101有23個block,查了17個block,也就是17 x 3 = 51層。

3.3、ResNet50代碼實現

keras實現:

conv_block:

identity_block:

3.4、輸出特徵圖大小

輸出特徵圖大小計算:

input_length = (input_length - filter_size + stride) // stride

4、筆記

4.1、網絡的深度爲什麼重要?

因爲CNN能夠提取low/mid/high-level的特徵,網絡的層數越多,意味着能夠提取到不同level的特徵越豐富。並且,越深的網絡提取的特徵越抽象,越具有語義信息。

4.2、爲什麼不能簡單地增加網絡層數?

對於原來的網絡,如果簡單地增加深度,會導致梯度彌散或梯度爆炸。

對於該問題的解決方法是正則化初始化和中間的正則化層(Batch Normalization),這樣的話可以訓練幾十層的網絡

雖然通過上述方法能夠訓練了,但是又會出現另一個問題,就是退化問題,網絡層數增加,但是在訓練集上的準確率卻飽和甚至下降了。這個不能解釋爲overfitting,因爲overfit應該表現爲在訓練集上表現更好纔對。

4.3、退化問題的解決

深度殘差網絡。如果深層網絡的後面那些層是恆等映射,那麼模型就退化爲一個淺層網絡。那現在要解決的就是學習恆等映射函數了。 但是直接讓一些層去擬合一個潛在的恆等映射函數H(x) = x,比較困難,這可能就是深層網絡難以訓練的原因。但是,如果把網絡設計爲H(x) = F(x) + x,如下圖。我們可以轉換爲學習一個殘差函數F(x) = H(x) - x. 只要F(x)=0,就構成了一個恆等映射H(x) = x. 而且,擬合殘差肯定更加容易。

4.4、其它ResNet結構

F是求和前網絡映射,H是從輸入到求和後的網絡映射。比如把5映射到5.1,那麼引入殘差前是F'(5)=5.1,引入殘差後是H(5)=5.1, H(5)=F(5)+5, F(5)=0.1。這裏的 F'和F都表示網絡參數映射,引入殘差後的映射對輸出的變化更敏感。比如s輸出從5.1變到5.2,映射F'的輸出增加了1/51=2%,而對於殘差結構輸出從5.1到5.2,映射F是從0.1到0.2,增加了100%。明顯後者輸出變化對權重的調整作用更大,所以效果更好

至於爲何shortcut的輸入時X,而不是X/2或是其他形式。kaiming大神的另一篇文章[2]中探討了這個問題,對以下6種結構的殘差結構進行實驗比較,shortcut是X/2的就是第二種,結果發現還是第一種效果好。

這種殘差學習結構可以通過前向神經網絡+shortcut連接實現,如結構圖所示。而且shortcut連接相當於簡單執行了同等映射,不會產生額外的參數,也不會增加計算複雜度。 而且,整個網絡可以依舊通過端到端的反向傳播訓練。

5、ResNet結構分析

網絡結構:

實驗-關鍵點:

1)實驗了plain-18和plain-34,展示了退化問題。說明了退化問題不是因爲梯度彌散,因爲加入了BN。另外也不能簡單地增加迭代次數來使其收斂,增加迭代次數仍然會出現退化問題

2)實驗了ResNet-18和ResNet-34不會出現退化問題,ResNet-34明顯表現的比ResNet-18和plain-34好,證明了殘差學習解決了隨網絡深度增加帶來的退化問題。 而且同等深度的plain-18和ResNet-18,殘差網絡更容易優化,收斂更快

3)對於同等映射維度不匹配時,匹配維度的兩種方法,zero padding是參數free的,投影法會帶來參數。作者比較了這兩種方法的優劣。實驗證明,投影法會比zero padding表現稍好一些。因爲zero padding的部分沒有參與殘差學習。實驗表明,將維度匹配或不匹配的同等映射全用投影法會取得更稍好的結果,但是考慮到不增加複雜度和參數free,不採用這種方法。

4)更深的瓶頸結構:

作者探索的更深的網絡。 考慮到時間花費,將原來的building block(殘差學習結構)改爲瓶頸結構,如上圖。首端和末端的1x1卷積用來削減和恢復維度,相比於原本結構,只有中間3x3成爲瓶頸部分。這兩種結構的時間複雜度相似。此時投影法映射帶來的參數成爲不可忽略的部分(以爲輸入維度的增大),所以要使用zero padding的同等映射

替換原本ResNet的殘差學習結構,同時也可以增加結構的數量,網絡深度得以增加。生成了ResNet-50,ResNet-101,ResNet-152. 隨着深度增加,因爲解決了退化問題,性能不斷提升。

代碼實現:https://github.com/alexzhang19/pytorch-classify/blob/master/models/resnet.py

參考文章

1、簡書-殘差網絡ResNet筆記

https://www.jianshu.com/p/e58437f39f65

2、resnet解析

https://blog.csdn.net/lanran2/article/details/79057994

 

 

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