ResNet 在 2015 年被提出,在 ImageNet 比赛 classification 任务上获得第一名,因为它 “简单与实用” 并存,之后很多方法都建立在 ResNet50 或者 ResNet101 的基础上完成的,检测,分割,识别等领域都纷纷使用 ResNet,Alpha zero 也使用了 ResNet,所以可见 ResNet 确实很好用。
下面我们从实用的角度去看看 ResNet。

1.ResNet 意义

随着网络的加深,出现了训练集准确率下降的现象,我们可以确定这不是由于 Overfit 过拟合造成的(过拟合的情况训练集应该准确率很高);所以作者针对这个问题提出了一种全新的网络,叫深度残差网络,它允许网络尽可能的加深,其中引入了全新的结构如图 1;
这里问大家一个问题
残差指的是什么
其中 ResNet 提出了两种 mapping:一种是 identity mapping,指的就是图 1 中” 弯弯的曲线”,另一种 residual mapping,指的就是除了” 弯弯的曲线 “那部分,所以最后的输出是 y\=F(x)+x
identity mapping 顾名思义,就是指本身,也就是公式中的 x,而 residual mapping 指的是 “”,也就是 y−x,所以残差指的就是 F(x) 部分。
为什么 ResNet 可以解决 “随着网络加深,准确率不下降” 的问题?
除了实验证明外:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图1

表 1,Resnet 在 ImageNet 上的结果
理论上,对于 “随着网络加深,准确率下降” 的问题,Resnet 提供了两种选择方式,也就是 identity mapping 和 residual mapping,如果网络已经到达最优,继续加深网络,residual mapping 将被 push 为 0,只剩下 identity mapping,这样理论上网络一直处于最优状态了,网络的性能也就不会随着深度增加而降低了。

2.ResNet 结构

它使用了一种连接方式叫做 “shortcut connection”,顾名思义,shortcut 就是“抄近道” 的意思,看下图我们就能大致理解:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图2

图 1 Shortcut Connection
这是文章里面的图,我们可以看到一个 “弯弯的弧线 “这个就是所谓的”shortcut connection“,也是文中提到identity mapping,这张图也诠释了 ResNet 的真谛,当然大家可以放心,真正在使用的 ResNet 模块并不是这么单一,文章中就提出了两种方式:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图3

图 2 两种 ResNet 设计
这两种结构分别针对 ResNet34(左图)和 ResNet50/101/152(右图),一般称整个结构为一个”building block“。其中右图又称为”bottleneck design”,目的一目了然,就是为了降低参数的数目,第一个 1x1 的卷积把 256 维 channel 降到 64 维,然后在最后通过 1x1 卷积恢复,整体上用的参数数目:1x1x256x64 + 3x3x64x64 + 1x1x64x256 = 69632,而不使用 bottleneck 的话就是两个 3x3x256 的卷积,参数数目: 3x3x256x256x2 = 1179648,差了 16.94 倍。
对于常规 ResNet,可以用于 34 层或者更少的网络中,对于 Bottleneck Design 的 ResNet 通常用于更深的如 101 这样的网络中,目的是减少计算和参数量(实用目的)。

问大家一个问题:
如图 1 所示,如果 F(x) 和 x 的 channel 个数不同怎么办,因为 F(x) 和 x 是按照 channel 维度相加的,channel 不同怎么相加呢?
针对 channel 个数是否相同,要分成两种情况考虑,如下图:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图4

图 3 两种 Shortcut Connection 方式
如图 3 所示,我们可以清楚的”实线“和”虚线“两种连接方式,
实线的的 Connection 部分 (”第一个粉色矩形和第三个粉色矩形“) 都是执行 3x3x64 的卷积,他们的 channel 个数一致,所以采用计算方式:
y\=F(x)+x
虚线的的 Connection 部分 (”第一个绿色矩形和第三个绿色矩形“) 分别是 3x3x64 和 3x3x128 的卷积操作,他们的 channel 个数不同 (64 和 128),所以采用计算方式:
y\=F(x)+Wx
其中 W 是卷积操作,用来调整 x 的 channel 维度的;
下面我们看看两个实例:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图5

图 4 两种 Shortcut Connection 方式实例(左图 channel 一致,右图 channel 不一样)

3.ResNet50 和 ResNet101

这里把 ResNet50 和 ResNet101 特别提出,主要因为它们的出镜率很高,所以需要做特别的说明。给出了它们具体的结构:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图6

表 2,Resnet 不同的结构
首先我们看一下表 2,上面一共提出了 5 中深度的 ResNet,分别是 18,34,50,101 和 152,首先看表 2 最左侧,我们发现所有的网络都分成 5 部分,分别是:conv1,conv2_x,conv3_x,conv4_x,conv5_x,之后的其他论文也会专门用这个称呼指代 ResNet50 或者 101 的每部分。
拿 101-layer 那列,我们先看看 101-layer 是不是真的是 101 层网络,首先有个输入 7x7x64 的卷积,然后经过 3 + 4 + 23 + 3 = 33 个 building block,每个 block 为 3 层,所以有 33 x 3 = 99 层,最后有个 fc 层 (用于分类),所以 1 + 99 + 1 = 101 层,确实有 101 层网络;
注:101 层网络仅仅指卷积或者全连接层,而激活层或者 Pooling 层并没有计算在内;
这里我们关注 50-layer 和 101-layer 这两列,可以发现,它们唯一的不同在于 conv4_x,ResNet50 有 6 个 block,而 ResNet101 有 23 个 block,查了 17 个 block,也就是 17 x 3 = 51 层。

4. 基于 ResNet101 的 Faster RCNN

文章中把 ResNet101 应用在 Faster RCNN 上取得了更好的结果,结果如下:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图7

ResNet解析_lanran2的博客-CSDN博客_resnet - 图8

表 3,Resnet101 Faster RCNN 在 Pascal VOC07/12 以及 COCO 上的结果
这里有个问题:
Faster RCNN 中 RPN 和 Fast RCNN 的共享特征图用的是 conv5_x 的输出么?
针对这个问题我们看看实际的基于 ResNet101 的 Faster RCNN 的结构图:
ResNet解析_lanran2的博客-CSDN博客_resnet - 图9

图 5 基于 ResNet101 的 Faster RCNN
图 5 展示了整个 Faster RCNN 的架构,其中蓝色的部分为 ResNet101,可以发现 conv4_x 的最后的输出为 RPN 和 RoI Pooling 共享的部分,而 conv5_x(共 9 层网络) 都作用于 RoI Pooling 之后的一堆特征图 (14 x 14 x 1024),特征图的大小维度也刚好符合原本的 ResNet101 中 conv5_x 的输入;
最后大家一定要记得最后要接一个 average pooling,得到 2048 维特征,分别用于分类和框回归。
https://blog.csdn.net/lanran2/article/details/79057994