关于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)”允许梯度直接反向传播到更浅的层。
图像左边是神经网络的主路,图像右边是添加了一条捷径的主路,通过这些残差块堆叠在一起,可以形成一个非常深的网络。
用一句话概括,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)