RESNET 網絡結構


ResNet結構

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

圖1 Shortcut Connection

        這是文章里面的圖,我們可以看到一個“彎彎的弧線“這個就是所謂的”shortcut connection“,也是文中提到identity mapping,這張圖也詮釋了ResNet的真諦,當然大家可以放心,真正在使用的ResNet模塊並不是這么單一,文章中就提出了兩種方式:

圖2 兩種ResNet設計

        這兩種結構分別針對ResNet34(左圖)和ResNet50/101/152(右圖),一般稱整個結構為一個”building block“。其中右圖又稱為”bottleneck design”,目的一目了然,就是為了降低參數的數目。看右圖,輸入是一個3×3×256的特征,第一個步驟用64個1x1的卷積把256維channel降到64維,然后在最后通過1x1卷積恢復到256個channel,整體上用的參數數目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用bottleneck的話參考左圖,輸入假設是3x3x256,第一步經過256個卷積核3×3×256,第二部再經過256個卷積核3×3×256。所以參數數目: 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

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

y=F(x)+W·x   其中W是卷積操作,用來調整x的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維特征,分別用於分類和框回歸。

5.到底哪種是ResNet的結構?

        ResNet殘差網絡,想必大家一定很熟悉了,那么先考考大家,下面(1)-(5)的結構哪個是我們常用的ResNet結構?

        其中weight指conv層,BN指Batch Normalization層,ReLU指激活層,addition指相加;根據ResNet的描述,似乎以上五組都符合,那么2016年ResNet原文是哪一個結構呢?以及其他四組結構也都work么?我們不禁有了這兩個疑問,伴隨着疑問我們一一揭開謎題;

        針對第一個問題,ResNet原文中使用的結構是(1)。

     (1)的特點有兩個:1)BN和ReLU在weight的后面;2)最后的ReLU在addition的后面;

       對於特點1),屬於常規范疇,我們平時也都這個順序:Conv->BN->ReLU;

       對於特點2),為什么ReLU放在addition后面呢?按照常規,不是應該是圖(3)這種么,那么我們接下來引出的問題就是:

         圖(3)的結構work么?

        對於每個圖右側部分我們稱作“residual”分支,左側部分我們稱作“identity”分支,如果ReLU作為“residual”分支的結尾,我們不難發現“residual”分支的結果永遠非負,這樣前向的時候輸入會單調遞增,從而會影響特征的表達能力,所以我們希望“residual”分支的結果應該在(-∞, +∞);這點也是我們以后設計網絡時所要注意的。

        對於圖(3)不OK的情況,那如果把BN也挪到addition后面呢?如圖(2),同時也保證了“residual”分支的取值范圍?

       這里BN改變了“identity”分支的分布,影響了信息的傳遞,在訓練的時候會阻礙loss的下降;這里大家肯定又有個問題:

為什么“identity”分支發生變化,會影響信息傳遞,從而影響訓練呢?

這里簡單回顧ResNet的公式:

在分析圖(4)和圖(5)之前,我們引出一個概念:”Post-activation”激活之后和”Pre-activation”激活之前,其中Post和Pre的概念是相對於weight(conv)層來說的,那么我們不難發現,圖(1), (2), (3)都是”Post-activation”,圖(4), (5)都是”Pre-activation”,那么兩種模式哪一個更好呢?這里我們就用實驗結果說話。

上圖是5種結構在Cifar10上的實驗結果,一共實驗了兩種網絡ResNet110和ResNet164。

從實驗結果上,我們可以發現圖(4)的結構與ResNet原結構伯仲之間,稍稍遜色,然而圖(5)的結構卻好於ResNet原結構。圖5的結構好的原因在於兩點:1)反向傳播基本符合假設,信息傳遞無阻礙;2)BN層作為pre-activation,起到了正則化的作用;

最后我們通常把圖5的結構稱作ResNetV2,這里我們給出ResNetV1和ResNetV2結構:

參考文章:

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM