引言
之前我讀了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個先后操作
-
CONV
CONV
是卷積(Convolution)的縮寫,7×7
指卷積核大小,64
指卷積核的數量(即該卷積層輸出的通道數),/2
指卷積核的步長為2。 -
BN
BN
是Batch Normalization的縮寫,即常說的BN層。 -
RELU
RELU
指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):@絕版臭咸魚
微信公眾號:@臭咸魚
轉載請注明出處,歡迎討論和交流!