ResNet是由2015年的论文:Deep Residual Learning for Image Recognition提出,现在在深度学习网络中应用越来越广泛。

ResNet

提出背景就是深层神经网络训练困难的问题,究其原因主要是因为梯度消失/爆炸,导致模型难以收敛,尽管batch normalization的使用可以使几十层的网络使用SGD算法训练收敛,但是更深的网络就没办法了。就算能收敛,也还是存在模型性能退化的问题,模型误差不降反升。
ResNet解读
为了解决这个问题,论文作者提出残差结构,让网络不去直接拟合目标函数H(x),而是去拟合它的残差F(x)=H(x)-x,结构如下图:
ResNet解读
这种结构可以较好的解决梯度消失的问题。梯度消失产生的原因就是在误差反向传播过程中,每一层都要乘以该层**函数的导数,对于sigmoid型**函数,其导数始终小于等于1的,所以反向传播过程中误差越来越小,梯度也越来越小,参数也就越来越难更新。当然,ReLU**函数其在x>0的部分导数为1,可以一定程度上缓解梯度消失问题。
说完梯度消失,再来看残差结构,其在求梯度时会有一个常数项存在,就不存在梯度消失的问题了,如下图(图片源于博客https://blog.csdn.net/a19715/article/details/78503467):
ResNet解读

ResNet block

论文里面给出了两种resnet block,如下图:
ResNet解读
左边这种主要是在resnet-18和resnet-34里面用的,右边这种主要是在更深层的网络resnet-50,resnet-101,resnet-152里面用的(作者这样调整的原因论文里说的是:Because of concerns on the training time that we can afford, we modify the building blockas a bottleneck design,也就是考虑训练时间问题)
下面给出论文里的各种resnet网络结构:
ResNet解读
在残差模块里面shortcut时候,要考虑F(x)和x为维度的问题,维度一致是可以直接相加,但维度不一致时,作者就提供两种方法:
(1)当F(x)和x的通道数不一致的时候,对于x不足的通道数,直接用0补齐使其与F(x)通道数一致,这种方式没有引入额外参数;
ResNet解读
(2)使用1*1卷积来映射处理,使其维度一致
ResNet解读
另外,在每次F(x)和x的特征图尺寸不同的时候,都进行步长为2的卷积
ResNet解读

上面这么讲肯定有点抽象,不知道网络结构具体是怎样实现的,下面就以resnet-18为例,讲一下网络具体的结构实现。

Resnet-18

resnet-18包含了4个残差层,每层两个resnet block,共16层卷积,再加上开始一层卷积和最后一个全连接层,共有18层带权重的层,所以叫resnet-18。
下面我讲的resnet-18结构是torchvision里面模型,模型结构打印出来之后如下图:
ResNet解读

ResNet解读
以第2个残差层为例:
ResNet解读
可以看出第1个残差层到第2个残差层,特征图的数目有64增加到了128,而且输出特征图尺寸有5656变成了2828,那么在第1个残差层输出到第2个残差层的第一个resnet block就存在F(x)和x的维度不一致的问题,再看torchvision里面模型的结构,红线圈出的downsample结构就是对x进行1*1卷积,步长为2的下采样过程,实现与第2个残差层的第一个resnet block的F(x)对齐操作。

OK,到这里就差不多了。
原创不易,转载请注明出处!

相关文章:

  • 2022-01-03
  • 2021-04-27
  • 2022-01-06
  • 2021-09-10
  • 2021-07-15
  • 2021-07-27
  • 2022-12-23
  • 2021-07-10
猜你喜欢
  • 2021-07-11
  • 2021-06-14
  • 2018-05-17
  • 2022-12-23
  • 2021-08-22
  • 2021-11-03
  • 2023-02-22
相关资源
相似解决方案