關於shortcut的一點思考


參考自: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)”允許梯度直接反向傳播到更淺的層。

image-20200807174236285

​ 圖像左邊是神經網絡的主路,圖像右邊是添加了一條捷徑的主路,通過這些殘差塊堆疊在一起,可以形成一個非常深的網絡。

用一句話概括,shortcut是為了防止梯度發散而跨越一個或多個層,允許梯度直接反向傳播到更淺的層。

shortcut的實現

shortcut存在二種不同的類型,一種是經過網絡之后輸出和輸入尺寸是一樣的,還有一種輸出和輸入的維度不匹配,這個時候我們通過Conv + BN的方法將輸入的尺寸變成輸出尺寸!

  1. 輸入和輸出維度匹配的情況:

    image-20200807174934600

    對應代碼中的:

    if stride == 1 and in_planes == out_planes:
         self.shortcut = nn.Sequential()
    
  2. 輸入和輸出維度不匹配的情況(需要借助conv+bn將輸入尺寸降低)

    image-20200807175010276

    對應代碼中的

    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)
    


免責聲明!

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



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