ResNet在2015年由微软实验室提出,斩获当年ImageNet竞赛中分类任务第一名,目标检测第一名。获得COCO数据集中目标检测第一名,图像分割第一名。
ResNet34层模型的结构简图:
ResNet网络中的亮点:
- 超深的网络结构(突破1000层)
- 提出residual模块(残差结构)
- 使用Batch Normalization加速训练(丢弃dropout)
在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题。1)梯度消失或梯度爆炸。 2)退化问题(degradation problem)。
对于这两个问题的解决:
- 通过数据的预处理以及在网络中使用BN(Batch Normalization)层能够解决梯度消失或梯度爆炸问题。
- 通过residual结构(残差结构)来减轻退化问题(随着网络层数的加深,效果会变差。如下图)。
使用残差结构,随着网络的加深,效果没有变差,反而变得更好了。
ResNet论文中给出了两种残差结构。左边的残差结构是针对层数较少的网络,例如ResNet18层和ResNet34层网络。右边的是针对网络层数较多的网络,例如ResNet101,ResNet152等。
- 深层网络使用右侧的残差结构能够减少网络参数与运算量。
- 同样输入一个channel为256的特征矩阵,如果使用左侧的残差结构,需要大约1170648个参数,使用右侧的残差结构只需要69632个参数。明显搭建深层网络时,使用右侧的残差结构更合适。
- 主分支是由两层3x3的卷积层组成
- 右侧的连接线是shortcut(捷径)分支,也称捷径分支
- 主分支与shortcut的输出特征矩阵shape必须相同。输出矩阵相同才能进行相加。
- 如上图ResNet34网络结构中存在虚线的残差结构。虚线的残差结构具有降维的作用,并在捷径分支上通过1x1的卷积核进行降维处理。注意步距stride,以及捷径分支上的卷积核的个数(与主分支上的卷积核个数相同)。
- 针对ResNet50/101/152的残差结构如上图。在该残差结构中,主分支使用了三个卷积层。
- 第一层使用1x1的卷积层来压缩channel维度,第二层是3x3卷积层,第三层是1x1的卷积层用来还原channel维度(注意主分支上第一层卷积层和第二次卷积层所使用的卷积核个数是相同的,第三次是第一层的4倍)。
- 该残差结构所对应的虚线残差结构如下图右侧所示,同样在捷径分支上有一层1x1的卷积层,它的卷积核个数与主分支上的第三层卷积层卷积核个数相同,注意每个卷积层的步距。
下面这幅图是原论文给出的不同深度的ResNet网络结构配置,表中的xN表示将该残差结构重复N次。
- 对于我们ResNet18/34/50/101/152,表中conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层残差结构都是虚线残差结构。因为这一系列残差结构的第一层都有调整输入特征矩阵shape的使命。
- 对于我们ResNet50/101/152,其实在conv2_x所对应的一系列残差结构的第一层也是虚线残差结构。因为它需要调整输入特征矩阵的channel。第一层残差结构需要将shape从[56, 56, 64] --> [56, 56, 256]。注意,这里只调整channel维度,高和宽不变(而conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层虚线残差结构不仅要调整channel还要将高和宽缩减为原来的一半)。