引言
之前我讀了ResNet的論文Deep Residual Learning for Image Recognition,也做了論文筆記,筆記里記錄了ResNet的理論基礎(核心思想、基本Block結構、Bottleneck結構、ResNet多個版本的大致結構等等),看本文之間可以先看看打打理論基礎。
一個下午的時間,我用PPT純手工做了一張圖片詳細說明ResNet50的具體結構,本文將結合該圖片詳細介紹ResNet50。
這張圖和這篇文章估計全網最詳細了(狗頭)。
廢話不多說,先放圖片(文末有圖片和PPT源文件的下載鏈接)。

上圖(稱為本圖)可划分為左、中、右3個部分,三者內容分別如下
- ResNet50整體結構
- ResNet50各個Stage具體結構
- Bottleneck具體結構
接下來為正文內容,本文先后介紹了本圖從左到右的3個部分,並對Bottleneck進行了簡要分析。
ResNet50整體結構
首先需要聲明,這張圖的內容是ResNet的Backbone部分(即圖中沒有ResNet中的全局平均池化層和全連接層)。
如本圖所示,輸入INPUT經過ResNet50的5個階段(Stage 0、Stage 1、……)得到輸出OUTPUT。
下面附上ResNet原文展示的ResNet結構,大家可以結合着看,看不懂也沒關系,只看本文也可以無痛理解的。

上圖描述了ResNet多個版本的具體結構,本文描述的“ResNet50”中的50指有50個層。和上圖一樣,本圖描述的ResNet也分為5個階段。
ResNet各個Stage具體結構
如本圖所示,ResNet分為5個stage(階段),其中Stage 0的結構比較簡單,可以視其為對INPUT的預處理,后4個Stage都由Bottleneck組成,結構較為相似。Stage 1包含3個Bottleneck,剩下的3個stage分別包括4、6、3個Bottleneck。
現在對Stage 0和Stage 1進行詳細描述,同理就可以理解后3個Stage。
Stage 0
-
(3,224,224)指輸入INPUT的通道數(channel)、高(height)和寬(width),即(C,H,W)。現假設輸入的高度和寬度相等,所以用(C,W,W)表示。 -
該stage中第1層包括3個先后操作
-
CONVCONV是卷積(Convolution)的縮寫,7×7指卷積核大小,64指卷積核的數量(即該卷積層輸出的通道數),/2指卷積核的步長為2。 -
BNBN是Batch Normalization的縮寫,即常說的BN層。 -
RELURELU指ReLU激活函數。
-
-
該stage中第2層為
MAXPOOL,即最大池化層,其kernel大小為3×3、步長為2。 -
(64,56,56)是該stage輸出的通道數(channel)、高(height)和寬(width),其中64等於該stage第1層卷積層中卷積核的數量,56等於224/2/2(步長為2會使輸入尺寸減半)。
總體來講,在Stage 0中,形狀為(3,224,224)的輸入先后經過卷積層、BN層、ReLU激活函數、MaxPooling層得到了形狀為(64,56,56)的輸出。
Stage 1
在理解了Stage 0以及熟悉圖中各種符號的含義之后,可以很容易地理解Stage 1。理解了Stage 1之后,剩下的3個stage就不用我講啦,你自己就能看懂。
Stage 1的輸入的形狀為(64,56,56),輸出的形狀為(64,56,56)。
下面介紹Bottleneck的具體結構(難點),把Bottleneck搞懂后,你就懂Stage 1了。
Bottleneck具體結構
現在讓我們把目光放在本圖最右側,最右側介紹了2種Bottleneck的結構。
“BTNK”是BottleNeck的縮寫(本文自創,請謹慎使用)。
2種Bottleneck分別對應了2種情況:輸入與輸出通道數相同(BTNK2)、輸入與輸出通道數不同(BTNK1),這一點可以結合ResNet原文去看喔。
BTNK2
我們首先來講BTNK2。
BTNK2有2個可變的參數C和W,即輸入的形狀(C,W,W)中的c和W。
令形狀為(C,W,W)的輸入為\(x\),令BTNK2左側的3個卷積塊(以及相關BN和RELU)為函數\(F(x)\),兩者相加(\(F(x)+x\))后再經過1個ReLU激活函數,就得到了BTNK2的輸出,該輸出的形狀仍為(C,W,W),即上文所說的BTNK2對應輸入\(x\)與輸出\(F(x)\)通道數相同的情況。
BTNK1
BTNK1有4個可變的參數C、W、C1和S。
與BTNK2相比,BTNK1多了1個右側的卷積層,令其為函數\(G(x)\)。BTNK1對應了輸入\(x\)與輸出\(F(x)\)通道數不同的情況,也正是這個添加的卷積層將\(x\)變為\(G(x)\),起到匹配輸入與輸出維度差異的作用(使得\(G(x)\)和\(F(x)\)通道數相同),進而可以進行求和\(F(x)+G(x)\)。
簡要分析
可知,ResNet后4個stage中都有BTNK1和BTNK2。
-
4個stage中
BTNK2參數規律相同4個stage中
BTNK2的參數全都是1個模式和規律,只是輸入的形狀(C,W,W)不同。 -
Stage 1中
BTNK1參數的規律與后3個stage不同然而,4個stage中
BTNK1的參數的模式並非全都一樣。具體來講,后3個stage中BTNK1的參數模式一致,Stage 1中BTNK1的模式與后3個stage的不一樣,這表現在以下2個方面:-
參數
S:BTNK1左右兩個1×1卷積層是否下采樣Stage 1中的
BTNK1:步長S為1,沒有進行下采樣,輸入尺寸和輸出尺寸相等。后3個stage的
BTNK1:步長S為2,進行了下采樣,輸入尺寸是輸出尺寸的2倍。 -
參數
C和C1:BTNK1左側第一個1×1卷積層是否減少通道數Stage 1中的
BTNK1:輸入通道數C和左側1×1卷積層通道數C1相等(C=C1=64),即左側1×1卷積層沒有減少通道數。后3個stage的
BTNK1:輸入通道數C和左側1×1卷積層通道數C1不相等(C=2*C1),左側1×1卷積層有減少通道數。
-
-
為什么Stage 1中
BTNK1參數的規律與后3個stage不同?(個人觀點)-
關於
BTNK1左右兩個1×1卷積層是否下采樣因為Stage 0中剛剛對網絡輸入進行了卷積和最大池化,還沒有進行殘差學習,此時直接下采樣會損失大量信息;而后3個stage直接進行下采樣時,前面的網絡已經進行過殘差學習了,所以可以直接進行下采樣。
-
關於
BTNK1左側第一個1×1卷積層是否減少通道數根據ResNet原文可知,Bottleneck左側兩個1×1卷積層的主要作用分別是減少通道數和恢復通道數,這樣就可以使它們中間的3×3卷積層的輸入和輸出的通道數都較小,因此效率更高。
Stage 1中
BTNK1的輸入通道數C為64,它本來就比較小,因此沒有必要通過左側第一個1×1卷積層減少通道數。
-
福利

掃碼關注微信公眾號后回復resnet即可直接獲取圖片和PPT源文件的下載鏈接。
參考鏈接
https://www.bilibili.com/read/cv2051292
https://arxiv.org/abs/1512.03385
Github(github.com):@chouxianyu
Github Pages(github.io):@臭咸魚
知乎(zhihu.com):@臭咸魚
博客園(cnblogs.com):@臭咸魚
B站(bilibili.com):@絕版臭咸魚
微信公眾號:@臭咸魚
轉載請注明出處,歡迎討論和交流!
