关于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)
    
posted @ 2020-08-07 17:55  码我疯狂的码  阅读(4069)  评论(0编辑  收藏  举报