残差网络—ResNet

ResNet-34

在这里插入图片描述

再34层的ResNet的结构简图当中:首先是卷积层,然后是池化层,有连接线的结构就是一个残差结构再这个34层的ResNet是由一系列的残差结构组成的。最后通过一个平均池化层以及一个全脸基层也就是输出层组成的。这个网络的结构十分简单,基本就是堆叠残差结构组成的。

在这里插入图片描述

ResNet结构的一些亮点:

  • 超深的网络结构(突破了1000层)
  • 提出residual模块
  • 使用BN加速训练

简单的堆叠卷积层和池化层行不行?

 左边的图(论文当中),再堆叠在20层的网络结构的时候,模型的训练错误在1%-2%左右,但是当训练的层数增加到56层的时候,训练的错误在7%-8%。很明显通过卷积层和池化层的增加是不行的。

是什么原因在成训练的结果很差的呢?

在论文当中,作者提出的两个问题:随着网络层数的增加,梯度消失和梯度爆炸这个问题越来越明显。我们做一个假设,假设每一层的梯度误差是一个小于1的数,在反向传播的过程当中,没向前传播一次,都要乘上一个小于1的误差梯度。当网络越来月神的时候,乘上的小于1 的系数就越来越趋近于0.这样梯度越来越小,造成了梯度消失的情况。

反过来,梯度是一个大于1的数,在反向传播的过程中,每传播一次梯度就要乘上一个大于1 的数,当网络越来越深的时候,乘上大于1 的系数就无限大,梯度就越来越大,造成梯度爆炸的情况。

梯度消失和梯度爆炸的情况怎么解决呢?

通常是对数据进行标准化处理和权重初始化以及BN这些方法来解决。

在论文中,作者还提出的一个问题是退化问题。

在解决了梯度消失和梯度爆炸的情况,还是存在这层数的增加误差很大的情况,怎么解决文中所说的退化问题呢

提出了残差的结构,通过残差的结构就能解决退化问题,右图中的实线代表的是验证集的错误率,虚线代表的训练集的错误率,我们看验证集的错误率,随着层数的增加,错误率减小了,效果越好。

残差模块

提出的残差模块。正是因为提出了残差模块,可以搭建更深的网络。

左边的图主要是针对于网络层数较少(ResNet-34)的使用的残差结构,右边的图是针对层数较多的网络使用的残差结构。

先看左边的结构,主线是输入特征举着通过两个3×3 的卷积层得到结果,在这个主线的右边是有一个从输入到输出的结构,整个的结构的意思是在主线上经过一系列的卷积层之后得到的特征矩阵再与输入特征矩阵进行一个相加的操作(两个分支的矩阵在相同的维度上做的相加的操作),相加之后通过激活函数输出。注意:主分支与shortcut的输出特征矩阵shape必须是相同的。

 右边的这个结构,与左边结构的不同是在输入和输出上加了一个1×1的卷积层,这两个1×1的卷积层的作用是用来做什么的呢?

在图中可以知道这个输入矩阵的深度是256-d,通过第一层的卷积层(卷积核是64 )之后,这个输入矩阵的长和宽时不变的,但是通道数由原来的256变成了64.(第一层的卷积层是起到将维的作用)。到第三层的时候通道数变成了256 ,此时输出和输入的维数是一样的,此时就可以进行相加。

左右两个不同的残差结构对比节省了多少的参数呢?

左边的结构是1179648 ,右边结构的参数是69632,这样看来,使用的残差结构越多,使用的参数就越少。

文章中给的图:

在这里插入图片描述

 在34层的残差结构上由的层之间用的是实线,有的层用的是虚线。这有什么不同?

   

 首先采用实线的部分输入矩阵和输出矩阵的shape是一样的,所以能够直接进行相加,但是虚线所连接的输入和输出矩阵的shape是不一样的。右边的两张图进行一个对比可以得到:第一个3×3 128的卷积层的步长是2,从一开始输入矩阵的长是56 到输出的矩阵的长是28,这样是缩减了一半。通过卷积核128进行一个增加维数的操作,使得输出矩阵的深度是128。在shortcut的部分是添加了一个128 的卷积核,步长也是2.通过增加这个shortcut的卷积核使得输入矩阵的长和宽也缩减了原来的一半。这样的操作就保证了主线的输出矩阵和shortcut的输出矩阵是一样的。

输入矩阵的维数是[56,56,256],输出矩阵的维数是[28,28,512],这样的情况对应的是层数为50,101,152的。这是如何让进行操作的呢?

对于第一个卷积层的不尝试1 ,知识起到一个将维的作用。将输入的矩阵的深度变成了128,并没哟改变特征矩阵的高和宽,通过第二层的3×3的卷积层,输出卷积核的长和宽就缩减为原来的一半,变成28×28×128.再通过最后1×1 的卷积层来增加了深度,从原来的256变成了512

 所以虚线的作用是将输入矩阵的 长宽高进行一个变化。对于实线是没有变化的。所以对于conv3,conv4,conv5的第一层值得是虚线的结构。第一层必须将上一层的特征矩阵长宽高调整为当前层所需要的长宽高。

BN

使用BN 加速训练,使用了这种方法就不必在使用Dropout的方法了。BN的目的是使我们的batch数据所对应的特征矩阵的均值使0,方差是1 的分布规律。通过这个方法加速网洛的训练提升网路i的准确率。

在之前搭建网络的过程中,是先对图像数据进行一个预处理。满足某一分布规律,这样的话就能加速网络的训练,图像经过卷积层1得到的特征层不一定满足所期望的某一分布。所以BN 这个方法就是调整特征层(每一层的特征层)的分布满足均值为0,方差为1 的分布。

注意:BN 是调整输入一批数据的feature map的每一层的分布,让每一层的feature map都能满足均值为0,方差为1 的分布规律。并不是调整某一个的feature map所对应的分布。

进行标准化处理的公式, 首先计算每一个通道所对应的均值,这里所说的每一个通道这是一批数据同一个通道的所有数据的均值和方差。第三式是标准化所得到的初值。第四个式子是进一步的调整\gamma是调整数据方差大小,\beta是用来调整数据的均值,这两个学习参数通过反向传播学习得到的。均值和方差是通过一批批的计算统计得到的。

接下来将的实例:

 假设batch的size为2 ,输入两张图片所得到的两个特征矩阵:feature1 和feature2.现在对这两个特征矩阵进行BN处理的话,首先计算均值和方差,对于channel 1是计算整个batch的channel为1 的方差和均值。同理,channel 2一样。所求的均值和方差是向量而不是一个数值。向量维度和channel的深度是一样的。1对应的就是channe1的均值,0.5对应的就是channel2 的均值。通过BN公式就得到BN之后的特征矩阵的值。

猜你喜欢

转载自blog.csdn.net/upupyon996deqing/article/details/124862680