ResNet

ResNet

ResNet在 2015 2015 2015 年由微软实验室提出,斩获当年 lmageNet 竞赛中分类任务第一名,目标检测第一名。获得 coco 数据集中目标检测第一名,图像分割第一名。

网络中的亮点:

  • 超深的网络结构(突破 1000 1000 1000 层)
  • 提出 residual 模块
  • 使用 Batch Normalization 加速训练(丢弃 dropout )

在 ResNet 网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题:
1)梯度消失或梯度爆炸。
2)退化问题(degradation problem)。在 ResNet 论文中说通过数据的预处理以及在网络中使用 BN(Batch Normalization)层能够解决梯度消失或者梯度爆炸问题。如果不了解 BN 层可参考这个链接。但是对于退化问题(随着网络层数的加深,效果还会变差,如下图所示)并没有很好的解决办法。

在这里插入图片描述

图1 退化问题

所以 ResNet 论文提出了 residual 结构(残差结构)来减轻退化问题。下图是使用 residual 结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,反而变的更好了。

图2 使用 residual结构的前后对比

接着,我们就来分析下论文中的残差结构(residual),下图是论文中给出的两种残差结构。左边的残差结构是针对层数较少网络,例如 ResNet18 层和 ResNet34 层网络。右边是针对网络层数较多的网络,例如ResNet101,ResNet152 等。为什么深层网络要使用右侧的残差结构呢。因为,右侧的残差结构能够减少网络参数与运算量。
将左边的输出看成是256。
左边: 3 × 3 × 256 × 256 + 3 × 3 × 256 × 256 = 1179648 3\times3\times256\times256+3\times3\times256\times256=1179648 3×3×256×256+3×3×256×256=1179648
右边: 1 × 1 × 256 × 64 + 3 × 3 × 64 × 64 + 1 × 1 × 64 × 256 = 69632 1\times1\times256\times64+3\times3\times64\times64+1\times1\times64\times256=69632 1×1×256×64+3×3×64×64+1×1×64×256=69632
同样输入、输出一个 channel 为 256 的特征矩阵,如果使用左侧的残差结构需要大约 1170648 1170648 1170648 个参数,但如果使用右侧的残差结构只需要 69632 69632 69632 个参数。明显搭建深层网络时,使用右侧的残差结构更合适。

图3 参数数量比较

我们先对左侧的残差结构(针对 ResNet18/34 )进行一个分析。如下图所示,该残差结构的主分支是由两层 3 × 3 3\times3 3×3 的卷积层组成,而残差结构右侧的连接线是 shortcut 分支也称捷径分支(注意为了让主分支上的输出矩阵能够与我们捷径分支上的输出矩阵进行相加,必须保证这两个输出特征矩阵有相同的 shape )。如果刚刚仔细观察了 ResNet34 网络结构图,应该能够发现图中会有一些虚线的残差结构。在原论文中作者只是简单说了这些虚线残差结构有降维的作用,并在捷径分支上通过 1 × 1 1\times1 1×1 的卷积核进行降维处理。而下图右侧给出了详细的虚线残差结构,注意下每个卷积层的步距 stride ,以及捷径分支上的卷积核的个数(与主分支上的卷积核个数相同)。

图4 residual 结构 1

接着我们再来分析下针对 ResNet50/101/152 的残差结构,如下图所示。在该残差结构当中,主分支使用了三个卷积层,第一个是 1 × 1 1\times1 1×1 的卷积层用来压缩 channel 维度,第二个是 3 × 3 3\times3 3×3 的卷积层,第三个是 1 × 1 1\times1 1×1 的卷积层用来还原 channel 维度(注意主分支上第一层卷积层和第二层卷积层所使用的卷积核个数是相同的,第三层是第一层的 4 倍)。该残差结构所对应的虚线残差结构如下图右侧所示,同样在捷径分支上有一层 1 × 1 1\times1 1×1 的卷积层,它的卷积核个数与主分支上的第三层卷积层卷积核个数相同,注意每个卷积层的步距。(注意:原论文中,在下图右侧虚线残差结构的主分支中,第一个 1 × 1 1\times1 1×1 卷积层的步距是 2 ,第二个 3 × 3 3\times3 3×3 卷积层步距是 1 。但在 pytorch 官方实现过程中是第一个 1 × 1 1\times1 1×1 卷积层的步距是 1 ,第二个 3 × 3 3\times3 3×3 卷积层步距是 2 ,这么做的好处是能够在 top1 上提升大概 0.5 0.5% 0.5 的准确率。可参考 Resnet v1.5: https://ngc.nvidia.com/catalog/model-scripts/nvidia:resnet_50_v1_5_for_pytorch)

图5 residual 结构 2

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gs0GdlQ1-1657758611561)(.\图片\ResNet\官方解释.png)]

图6 官方解释

下面这幅图是原论文给出的不同深度的 ResNet 网络结构配置,注意表中的残差结构给出了主分支上卷积核的大小与卷积核个数,表中的 × N \times N ×N 表示将该残差结构重复 N N N 次。

图7 不同深度ResNet结构图

对于我们 ResNet18/34/50/101/152 ,表中 conv3_x, conv4_x, conv5_x 所对应的一系列残差结构的第一层残差结构都是虚线残差结构。因为这一系列残差结构的第一层都有调整输入特征矩阵 shape 的使命(将特征矩阵的高和宽缩减为原来的一半,将深度 channel 调整成下一层残差结构所需要的 channel )。为了方便理解,下面给出了 ResNet34 的网络结构图,图中简单标注了一些信息。

图8 ResNet-34网络结构图

注意,对于我们 ResNet50/101/152 ,其实在 conv2_x 所对应的一系列残差结构的第一层也是虚线残差结构。因为它需要调整输入特征矩阵的 channel ,根据表格可知通过 3 × 3 3\times3 3×3 的 max pool 之后输出的特征矩阵 shape 应该是 [56, 56, 64] ,但我们 conv2_x 所对应的一系列残差结构中的实线残差结构它们期望的输入特征矩阵 shape 是 [56, 56, 256] (因为这样才能保证输入输出特征矩阵shape相同,才能将捷径分支的输出与主分支的输出进行相加)。所以第一层残差结构需要将 shape 从 [56, 56, 64] --> [56, 56, 256]。注意,这里只调整 channel 维度,高和宽不变(而 conv3_x, conv4_x, conv5_x 所对应的一系列残差结构的第一层虚线残差结构不仅要调整 channel 还要将高和宽缩减为原来的一半)。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值