參考自:https://blog.csdn.net/alxe_made/article/details/84424577
https://cloud.tencent.com/developer/article/1148375
Shortcut的一點思考
在完成第三周作業時看到老師的代碼中有一段:
# 步長為 1 時,如果 in 和 out 的 feature map 通道不同,用一個卷積改變通道數
if stride == 1 and in_planes != out_planes:
self.shortcut = nn.Sequential(
nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=1, padding=0, bias=False),
nn.BatchNorm2d(out_planes)
)
# 步長為 1 時,如果 in 和 out 的 feature map 通道相同,直接返回輸入
if stride == 1 and in_planes == out_planes:
self.shortcut = nn.Sequential()
當時百思不得其解,而且不太清楚shortcut是什么東西。
於是百度之————
Shortcut是什么
shortcut(或shortpath,中文“直連”或“捷徑”)是CNN模型發展中出現的一種非常有效的結構。
研究人員發現,網絡的深度對CNN的效果影響非常大,但是單純地增加網絡深度並不能簡單地提高網絡的效果,由於梯度發散,反而可能損害模型的效果。而shortcut的引入就是解決這個問題的妙招。
以Resnet為例:
在殘差網絡中,一個“捷徑(shortcut)”或者說“跳躍連接(skip connection)”允許梯度直接反向傳播到更淺的層。
圖像左邊是神經網絡的主路,圖像右邊是添加了一條捷徑的主路,通過這些殘差塊堆疊在一起,可以形成一個非常深的網絡。
用一句話概括,shortcut是為了防止梯度發散而跨越一個或多個層,允許梯度直接反向傳播到更淺的層。
shortcut的實現
shortcut存在二種不同的類型,一種是經過網絡之后輸出和輸入尺寸是一樣的,還有一種輸出和輸入的維度不匹配,這個時候我們通過Conv + BN的方法將輸入的尺寸變成輸出尺寸!
-
輸入和輸出維度匹配的情況:
對應代碼中的:
if stride == 1 and in_planes == out_planes: self.shortcut = nn.Sequential()
-
輸入和輸出維度不匹配的情況(需要借助conv+bn將輸入尺寸降低)
對應代碼中的
if stride == 1 and in_planes != out_planes: self.shortcut = nn.Sequential( nn.Conv2d(in_planes, out_planes, kernel_size=1, stride=1, padding=0, bias=False), nn.BatchNorm2d(out_planes)