ResNet解析

ResNet在2015年被提出,在ImageNet比賽classification任務上獲得第一名,因爲它“簡單與實用”並存,之後很多方法都建立在ResNet50或者ResNet101的基礎上完成的,檢測,分割,識別等領域都紛紛使用ResNet,Alpha zero也使用了ResNet,所以可見ResNet確實很好用。
下面我們從實用的角度去看看ResNet。

1.ResNet意義

隨着網絡的加深,出現了訓練集準確率下降的現象,我們可以確定這不是由於Overfit過擬合造成的(過擬合的情況訓練集應該準確率很高);所以作者針對這個問題提出了一種全新的網絡,叫深度殘差網絡,它允許網絡儘可能的加深,其中引入了全新的結構如圖1;
這裏問大家一個問題:殘差指的是什麼?
其中ResNet提出了兩種mapping:一種是identity mapping,指的就是圖1中”彎彎的曲線”,另一種residual mapping,指的就是除了”彎彎的曲線“那部分,所以最後的輸出是 y=F(x)+x y=F(x)+xy=F(x)+x
identity mapping顧名思義,就是指本身,也就是公式中的x xx,而residual mapping指的是“差”,也就是y−x y−xy - x,所以殘差指的就是F(x) F(x)F(x)部分。
爲什麼ResNet可以解決“隨着網絡加深,準確率不下降”的問題?
除了實驗證明外:

                                                                         表1,Resnet在ImageNet上的結果
理論上,對於“隨着網絡加深,準確率下降”的問題,Resnet提供了兩種選擇方式,也就是identity mapping和residual mapping,如果網絡已經到達最優,繼續加深網絡,residual mapping將被push爲0,只剩下identity mapping,這樣理論上網絡一直處於最優狀態了,網絡的性能也就不會隨着深度增加而降低了。

2.ResNet結構

它使用了一種連接方式叫做“shortcut connection”,顧名思義,shortcut就是“抄近道”的意思,看下圖我們就能大致理解:
 
                                                                       圖1 Shortcut Connection
這是文章裏面的圖,我們可以看到一個“彎彎的弧線“這個就是所謂的”shortcut connection“,也是文中提到identity mapping,這張圖也詮釋了ResNet的真諦,當然大家可以放心,真正在使用的ResNet模塊並不是這麼單一,文章中就提出了兩種方式:
 
                                                                                       圖2 兩種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個數一致,所以採用計算方式:

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

                                                       y=F(x)+Wx y=F(x)+Wxy = F(x) + Wx
其中W是卷積操作,用來調整x的channel維度的;
下面我們看看兩個實例:
 
                                            圖4 兩種Shortcut Connection方式實例(左圖channel一致,右圖channel不一樣)

3.ResNet50和ResNet101

這裏把ResNet50和ResNet101特別提出,主要因爲它們的出鏡率很高,所以需要做特別的說明。給出了它們具體的結構:
              
                                                                         表2 Resnet不同的結構
首先我們看一下表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層。

4.基於ResNet101的Faster RCNN

文章中把ResNet101應用在Faster RCNN上取得了更好的結果,結果如下:
               
                                              表3 Resnet101 Faster RCNN在Pascal VOC07/12 以及COCO上的結果

這裏有個問題:Faster RCNN中RPN和Fast RCNN的共享特徵圖用的是conv5_x的輸出麼?
針對這個問題我們看看實際的基於ResNet101的Faster RCNN的結構圖:
 
                                                                   圖5 基於ResNet101的Faster RCNN
圖5展示了整個Faster RCNN的架構,其中藍色的部分爲ResNet101,可以發現conv4_x的最後的輸出爲RPN和RoI Pooling共享的部分,而conv5_x(共9層網絡)都作用於RoI Pooling之後的一堆特徵圖(14 x 14 x 1024),特徵圖的大小維度也剛好符合原本的ResNet101中conv5_x的輸入;
最後大家一定要記得最後要接一個average pooling,得到2048維特徵,分別用於分類和框迴歸。

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

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