前言
第一次看ResNet论文的时候,由于刚接触深度学习不久,对ResNet的理解仅仅停留在论文中阐述的一些基本思想。加上当时实验室的硬件条件很有限,用的模型基本上以AlexNet和VGG为主,并没有在学习中使用过ResNet。因此忽略了论文中提出的几种典型ResNet网络。一直到工作后,才发现ResNet的几种典型结构在诸多计算机视觉任务中都充当着非常重要的角色,因此很有必要更细致地了解一下ResNet的经典网络。若是刚接触ResNet,还是建议从最论文开始看起,我自己也写过一遍对于ResNet原理的简单介绍,见论文笔记:Deep Residual Network
ResNet的经典网络结构有:ResNet-18、ResNet-34、ResNet-50、ResNet-101、ResNet-152几种,其中,ResNet-18和ResNet-34的基本结构相同,属于相对浅层的网络,后面3种的基本结构不同于ResNet-18和ResNet-34,属于更深层的网络。本篇文章以ResNet-34和ResNet-50为例进行介绍。
ResNet结构
不论是多少层的ResNet网络,它们都有以下共同点:
- 网络一共包含5个卷积组,每个卷积组中包含1个或多个基本的卷积计算过程(Conv-> BN->ReLU)
- 每个卷积组中包含1次下采样操作,使特征图大小减半,下采样通过以下两种方式实现:
- 最大池化,步长取2,只用于第2个卷积组(Conv2_x)
- 卷积,步长取2,用于除第2个卷积组之外的4个卷积组
- 第1个卷积组只包含1次卷积计算操作,5种典型ResNet结构的第1个卷积组完全相同,卷积核均为7x7, 步长为均2
- 第2-5个卷积组都包含多个相同的残差单元,在很多代码实现上,通常把第2-5个卷积组分别叫做Stage1、Stage2、Stage3、Stage4
ResNet-34
由于论文中对于几种典型的ResNet网络结构画的比较简洁,跟多的是文字叙述,于是我自己根据论文的介绍和MMdetecrion中的ResNet主干网络源码重画了一下ResNet的结构图,下图是ResNet-34的结构图:
关于上图有几点需要解释:
- 每个绿色的矩形框表示ResNet的一个Stage,从上到下为Stage1 (Conv2_x)、Stage2 (Conv3_x)、Stage3 (Conv4_x)、Stage4 (Conv5_x)
- 绿色矩形框内的每个黄色的矩形框表示1个或多个标准的残差单元,黄色矩形框左侧的数值表示残差单元级联的数量,如5x表示5个级联的残差单元
- 通道数变化:输入通道为3,4个Stage的通道数依次为64、128、256、512,即每经过一个Stage通道数翻倍
- 层数计算:每个Stage包含的残差单元数量依次为3、4、6、3,每个残差单元包含2个卷积层,再算上第一个7x7卷积层和3x3最大池化层,总的层数=(3+4+6+3)*2+1+1 = 34
- 下采样:黄色矩形框中紫色的部分代表发生下采样操作,即特征图大小减半,右侧箭头标识即为下采样后的特征图大小(输入224x224为例);第一个绿色矩形框内的橙色矩形框表示最大池化,此处发生第一次下采样
- 卷积层参数解释:以Conv 3x3, c512, s2, p1为例, 3x3表示卷积核大小,c512表示卷积核数量/输出通道数量为512,s2表示卷积步长为2,p1表示卷积的padding取1。
- 池化层参数解释:Max_pool 3x3, c64, s2, p1,3x3表示池化的区域大小(类似于卷积核大小),c64表示输入输出通道为64,s2表示池化的步长为2,p1表示padding取1
对结构有一个大致的了解后,我们会发现:ResNet中的下采样操作发生在每个Stage的第一个残差单元或最大池化层,实现方式是操作都是通过在卷积或者池化中取步长为2。
另外,对于另外1个网络ResNet-18,和ResNet-34的区别在于每个Stage级联的残差单元数量不同,ResNet-184个Stage残差单元数量均为2,总层数=(2+2+2+2)*2+1+1 = 18
ResNet-50
ResNet-50的的整体结构于ResNet-18类型,具体如下:
与ResNet-18/34的主要区别在于以下几点:
- 基本残差单元
- ResNet-18/34的残差单元包含2个3x3卷积层
- ResNet-50的残差单元包含3个卷积层,依次为1x1,3x3和1x1
- 通道数变化
- ResNet-18/34的通道数在每个Stage的第1个残差单元的第1个卷积层输出翻倍,后续通道数保持不变
- ResNet-50的通道数在每个Stage的第1个残差单元的输出部分翻倍,而每个残差单元内部也伴随着通道数的变化(有减少也有增加,依靠1x1卷积层来调节),这主要是为了在深层的网络中减少参数数量。
- 下采样时刻
- ResNet-18/34的下采样操作发生在每个Stage(不包括Stage1)第1个残差单元中的第1个卷积层(conv 3x3)
- ResNet-50的下采样操作发生在每个Stage(不包括Stage1)第1个残差单元中的第2个卷积层(conv 3x3)
类似的,对于ResNet-101/152,与ResNet-50的区别也仅在于与每个Stage残差单元数量的不同,ResNet-50为(3,4,6,3),ResNet-101为(3,4,23,3),ResNet-152为(3,8,36,3),总层数的计算方式与ResNet-34类似,只是残差单元中卷积层数量由变为3。
ResNet变种
其实在许多计算机视觉任务的实现上,为了适应不同任务的特性,ResNet的结构也会发生细微的调整,例如在Caffe的实现中,把ResNet-50/101-152的下采样操作置于每个残差单元的第1个卷积层(conv 1x1);还有的实现中(如MMdetection),把第一个7x7的卷积层用2个3x3的卷积层代替来代替,以此减少大卷积核的参数。
另外最近在学习目标跟踪领域中的Siamese网络中发现,ResNet-50在目标跟踪领域中比较流行,但ResNet-50会带来一个问题:多次的下采样会降低目标跟踪的精度,而直接取消下采样操作又会降低网络的感受野。因此,为了在减少ResNet中下采样次数的同时保持原有的感受野,在ResNet-50中往往会舍弃1-2个下采样层(步长变回1),并使用膨胀卷积来保证原有的感受野不变(如Siamese RPN++和Siammask),有兴趣的可以去了解一下,这里不再过多介绍。
结语
本篇文章着重介绍ResNet的几种典型网络,对于基本的原理和思想没有过多提及,文中的内容主要根据论文原文和MMdetection中的源码来写的,有不恰当或错误的地方还请指正。