即残差网络,是由残差模块顺序堆叠而成。
1.对于相对较浅的18层和34层模型,它们所使用的是标准2层的残差模块,而相对深一些的50层以及更深的模型,使用的是带瓶颈设计的3层残差模块。
2.Residual最核心的地方就是它加入了加法操作,这个加法操作加入了一条恒等路径,使得网络学习的目标从拟合整个输入特征到输出特征的变换转变称拟合理想映射与实际映射之间的残差,这种转变大大降低了模型训练的难度。
-------------------------------------------------------------------------------------------------------------------------------
如果只是单纯的使用卷积和池化堆叠起来的网络,随着网络的加深,会造成梯度消失和梯度爆炸
- “梯度消失”:指的是即当梯度(小于1.0)在被反向传播到前面的层时,重复的相乘可能会使梯度变得无限小。
- “梯度爆炸”:指的是即当梯度(大于1.0)在被反向传播到前面的层时,重复的相乘可能会使梯度变得非常大甚至无限大导致溢出。
随着网络深度的不断增加,常常会出现以下两个问题:
- 长时间训练但是网络收敛变得非常困难甚至不收敛
- 网络性能会逐渐趋于饱和,甚至还会开始下降,可以观察到下图中56层的误差比20层的更多,故这种现象并不是由于过拟合造成的。 这种现象称为深度网络的退化问题。
本文提出残差网络来解决退化问题
3.ResNet34
首先是7*7的卷积层,然后是3*3的池化层,下边连接线是一系列残差模块,该网络是由一系列残差模块组成的,最后经过池化和全连接层得到输出。(即经过堆叠残差所得到的)。那么为什么有的残差结构的shortcut是实线,有的是虚线,下面会解释。
4.ResNet网络的亮点
①有超深的网络结构(突破1000层)
②提出residual模块。解决退化问题。
③使用Batch Normalization加速训练(丢弃dropout)解决梯度消失和梯度爆炸的问题
5.两种不同的残差结构
左边的图主要针对于堆叠的残差结构层数较少的网络,例如ResNet34。
右边的图主要针对于堆叠残差结构数目较多的网络,例如ResNet50/101/152.
首先看左边的图,主线是将特征矩阵通过两个3*3的卷积得到结构,右半部分是直接从输入连接到加号,意思是在主分支上经过一系列的卷积层所得到的矩阵再与右半部分的输入相加,相加之后再通过RELU激活函数得到特征矩阵。(第一层卷积后有relu激活函数,第二层是没有的),主分支和右侧分支(short cut)的输出的shape,即高宽和通道是一致的。这样才能保证两个分支进行参数的叠加。即两个矩阵在相同维度上进行加法运算。
然后看右边的图,首先主分支是通过一个1*1的卷积层,然后通过3*3的卷积层,然后再通过一个1*1的卷积层。那么两个1*1的卷积层的作用是什么呢?
①1*1的卷积核是用来降维和升维,实现多个特征图的线性组合,同时保持原有特征图的大小
我们通过图可以看到这个残差结构的输入的channel是256,那么经过第一个卷积层以后channel由256变成64,实现一个降维的作用,然后再经过第二个1*1的卷积层(卷积核是256),维度变成和输入维度一样具有256个通道数,这样就会和输入的特征矩阵高宽、channel一样,然后就可以进行参数叠加。
②相比于其他尺寸的卷积核,可以极大地降低运算复杂度
③由两个relu,可以引入更多的非线性映射。
6.ResNet34网络中有的shortcut是实线,有的是虚线原因
如图
对于shortcut是实线的残差结构,输入特征的sahpe和输出特征的shape是一样的,所以可以直接进行相加。
但是对于虚线的残差结构,输入和输出不一样,输入特征矩阵shape是【56,56,64】
输出特征矩阵是【28,28,128】,,输入通道的维数与输出通道的维数并不相同,那么不能直接相加,这时候就需要在残差连接的过程中添加一个1*1的卷积核来改变通道数。使输入和主分支得到的特征矩阵通道数一样,才可以进行矩阵相加。
将shortcut是实线的残差结构图和虚线 残差结构相对比,有两个不同之处:
①主干分支的第一个3*3卷积的stride变成了2,从而将高和宽缩小维原来的一半。再通过128个卷积核将channel数由56变为128
②shortcut部分(虚线部分)加入了1*1的卷积,stride也是2,目的也是将输入特征图的高和宽将为原来的一半,卷积核是128,从而使特征图的channel变为128
这样才可以保证我们主分支和shortcut分支输出的特征图的shape是一模一样的。
下采样就是通过这样的形式实现的。