从原论文解读ResNet原理及其Batch Normalization和迁移学习

ResNet在2015年由微软实验室提出,斩获了当年ImageNet竞赛中分类任务第一名,目标检测第一名,获得COCO数据集中目标检测第一名,图像分割第一名(啥也别说了,就是NB)。原文如下图,它的四个作者都是华人,在一些非常有名的深度学习文章中都能看到他们的名字。ResNet有这么几个亮点:超深的网络结构(突破1000层)、提出了残差模块使用Batch Normalization(一种标准化处理)加速训练(丢弃dropout)。
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第1张图片

简单入个门:首先先看一个34-layer ResNet:其首先是一个卷积层,之后是个池化层,图中有连接线的结构就代表一个残差结构,ResNet就是由一系列的残差结构所组成,最后再通过平均池化下采样的操作及一个全连接层得到最终输出。
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第2张图片
为什么需要残差块? 从原论文中截取出来如下几个图来解释:左上角的图就是将卷积层和池化层简单堆叠所搭建的网络结构,可以看出,并不是层数越深训练错误率越小,究竟是什么原因造成这种现象呢?在ResNet原论文中作者提出了两个问题,一是随着层数不断加深,梯度消失或梯度爆炸这个现象越来越明显。这里做一个假设:假设每一层的误差梯度是一个小于1的数,在反向传播过程中,每向前传播一次,都要乘以一个小于1的误差梯度,当网络越来越深,所乘的小于一的系数越多,梯度就越趋近于零,反过来如果每一层的梯度是一个大于1的数,则会发生梯度爆炸。二是再解决梯度消失的问题后,仍然会存在层数深的网络没有浅的网络效果好,这就是退化问题。在原论文中,通过残差结构可以很好的解决退化问题。右图就是在原论文在所搭的一系列不同层的网络,实线代表验证集的错误率,虚线代表训练集的错误率, 层是越深,效果越好,所以ResNet确实解决了退化问题,那么实际中就可以 通过残差结构不断加深网络,以获得更好的结果。
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第3张图片
残差结构? 从原论文中提取出两种不同的残差结构,左边针对层数较少的网络所使用,右边是针对层数较深的网络如ResNet-50/101/152
左边的残差结构:在主分支上将输入的特征矩阵通过两个3×3的卷积层得到结果,再让其与输入特征矩阵进行相加,之后再通过relu函数,需要注意的是需要在通过激活函数前将二者相加,由于相加操作主分支与侧分支输出的特征矩阵shape(高、宽、channel)必须相同,这样才能保证两个特征矩阵在相同的维度进行参数的累加。
右边的残差结构:在主分支上依次通过一个1×1,3×3,1×1的卷积层,这两个1×1的作用是:对于输入特征矩阵的通道数是256的,通过64个1×1的卷积核高和宽不发生改变,深度变为64,起到一个降维的作用,同理第二个是升维,因此才能进行相加。
右边和左边比起来到底节省了多少参数呢?假设左边也输入一个256深度的特征向量,则参数个数为:
3×3×256×256(为了保证深度相同)+3×3×256×256 = 1179648,对于右边的结构来说,需要的参数个数为:
1×1×256×64+3×3×64×64+1×1×256×64 = 69632,所以右边的残差结构所需参数个数明显少了很多,而且在网络的搭建过程中,是将一系列的残差结构进行堆叠,所使用的残差结构越多,节省的参数也就越多。
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第4张图片
网络结构:整个网络的框架基本都是类似的:都是通过一个7×7的卷积层,在通过一个3×3的最大池化下采样,再分别通过一系列的残差结构,再跟上平均池化下采样及全连接层作为输出,最后再用softmax将输出转化为概率分布。在表格中,将残差结构又分为了四块,每一块的乘积就代表堆叠基层。首先结合表格对34层网络进行分析:对于conv2_x残差结构,使用了3层残差层,也就是三条曲线,同理对于conv3_x残差结构,使用了4层残差层。
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第5张图片
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第6张图片
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第7张图片
为什么有的残差结构是实线,有的残差结构是虚线? 对于左图残差结构而言,其输入特征矩阵和输出的shape是一模一样的。所以能直接对其相加,对于右图虚线部分而言,其对应的是表格中conv3_x的第一层,输入特征矩阵shape是[56,56,64],输出特征矩阵shape是[28,28,128],只有通过虚线残差结构的输出才能输入到实线残差结构中,才能保证输入输出的shape是一模一样的。所以不管是第几个残差块,第一层都是虚线残差结构,其必须要将上一层的特征矩阵的高宽及深度调整为当前层所需要的特征矩阵的高宽和深度。
左边和右边的区别有两个:
①第一个3×3的卷积层stride发生了变化,通过stride=2可将宽和高缩减为原来的一半,通过128个卷积核改变特征矩阵的深度,得到想要的输出shape,
②测分支采用1×1的卷积核,同样stride=2,同时缩减高和宽并增加通道数。
这样就能保证主分支和侧分支输出的shape是一模一样的。

从原论文解读ResNet原理及其Batch Normalization和迁移学习_第8张图片
对于更深层次的残差结构而言,输入特征矩阵shape是[56,56,256],输出特征矩阵shape是[28,28,512],对于主分支而言。1×1且stride=1的卷积核只起到了降维的作用,第二个3×3且stride=2的卷积核让特征的高和宽缩减为原来的一半,第三个1×1的卷积层则是为了增加深度,对于侧分支则同时缩减高和宽并增加通道数。因此,对于浅层网络而言最大池化下采样的输出恰好是conv2_x的输入,因此第一层是不需要虚线的残差结构的,但对于深层网络,最大池化下采样后的输出与输入不匹配。,因此需要虚线的残差结构。
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第9张图片

注:1×1×n的卷积核学习能力小,根本学不到相邻像素的空间信息,无法提取出轮廓特征,因此不能一步到位,这里1×1的目的是为了压缩,减少其他尺寸卷积核的运算量,如果直接用原卷积核压缩,计算量大很多,所以提取特征和缩小通道是两个不同的卷积核。事实证明,只要合理的构建这个瓶颈层(压缩层),既可以显著的缩小输入层的规模,又不会降低网络性能,从而大量节省了计算。

什么是Batch Normalization?

Batch Normalization是google团队在2015年论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》提出的。通过该方法能够加速网络的收敛并提升准确率。在通常搭建网络的过程中,第一步会将图像集进行预处理,将图像数据调整到满足某一分布规律,从而加速网络训练。但是调整过的图像通过卷积层后得到的feature map就不一定满足我们所期望的某一分布规律,所以Batch Normalization就是调整feature map,让每一层的feature map都满足均值为0,方差为1的分布规律。
注意:这里是调整一批数据的feature map而不是一个图像的feature map。
假设我们输入的x是RGB三通道的彩色图像,那么这里的d就是输入图像的channels即d=3,x=(x{1, x2, x3),其中x1就代表我们的R通道所对应的特征矩阵,依此类推。标准化处理也就是分别对R通道,G通道,B通道进行处理。首先计算每一个通道对应的均值还有方差(一批数据的,不是一个数据),再将原参数减去均值再除以方差就得到标准化处理后的值, 分母有一个很小的参数是为了防止其等于0。调整完之后再通过两个参数进一步调整(调整数据方差的大小和均值),如果不这样做就会得到均值为0方差为1的数据组,但大多数人认为这样不是最好的,所以就有两个参数,这两个参数是通过反向传播学习得到的,而之前的均值和方差是经过计算统计得到的。 注意:求出来的均值和方差是一个向量,其维度是和channel对应的。从原论文解读ResNet原理及其Batch Normalization和迁移学习_第10张图片
下图是截取网上的一张计算BN的图,除了没有最后一步调整(因为这一步的参数是训练才能得到的),其他的计算思路很清晰:
从原论文解读ResNet原理及其Batch Normalization和迁移学习_第11张图片
使用BN时需要注意的问题:
①batch size尽可能设置大点,设置小后表现可能很糟糕,设置的越大求的均值和方差越接近整个训练集的均值和方差,如果batch size取1,使用BN是没有什么作用的,效果甚至可能变差,当然也要考虑到自己的硬件设备。
②根据ResNet原论文所述:建议将BN层放在卷积层(Conv)和激活层(例如Relu)之间,而不是放在激活层的后面,且卷积层不要使用偏置bias,因为使用不使用最后经过调整得到的值是一样的,还增加了参数的数量。
BN放到Relu之前的好处可以这样理解:BN可以防止某一层的激活值全部都被抑制,从而防止从这一层往前传的梯度全都变成0,也就是防止梯度消失。(当然也可以防止梯度爆炸)还有一个好处,把BN放到激活前面是有可以把卷积的weight和bn的参数进行合并的,所以它有利于网络在做前向inference时候进行加速。

迁移学习

使用迁移学习的优势:
1.能够快速的训练出一个理想的结果,如果从头训练网络的化可能需要迭代几十个epoch,但如果使用迁移学习的化可能就迭代两三个epoch就能达到一个理想的情况,其能大大的减少训练时间。
2.当数据集比较小的时候也能训练出理想的效果,之前说过如果网络特别大,数据集特别小的话会出现严重的过拟合情况,结果就会非常的糟糕,但如果使用迁移学习的方法,就能使用别人之前预训练好的模型参数去训练自己比较小的数据集。
很关键的一点:如果要使用别人预训练好的模型参数,则要注意别人的预处理方式,否则训练结果会很糟糕。
截取网上的一张图。解释迁移学习的原理:假设一个模型训练完之后,第一个卷积层学会了一些角点的信息,第二个卷积层学会了一些稍微复杂一点的纹理信息,随着卷积层的不断加深,它所学习到的信息越来越复杂,越来越抽象,最后通过全连接层将所学习到的一系列特征进行组合,输出每个类别对应的概率。浅层卷积层所学习到的信息是比较通用的信息,在本网络中适用,在其他网络中也是适用的,所以迁移就是将已经训练好的浅层网络参数迁移到新的网络当中来,新的网络也就拥有了识别底层通用特征的能力了,就能更加快速的学习新的数据集的高维特征。
常见的迁移学习方式:
1.载入权重后,针对自己的数据集,训练所有的参数,只修改全连接层的分类类别;(对于硬件参数不受限,希望得到最优的结果,当然比不使用迁移学习的方法还是要快很多的)
2.载入权重后只训练最后几层;(硬件参数有限或时间受限,二三任选其一)
3.载入权重后在原网络的基础上再添加一层全连接层,仅仅去训练最后一个添加的全连接层。

从原论文解读ResNet原理及其Batch Normalization和迁移学习_第12张图片

你可能感兴趣的:(深度学习+torch专栏,计算机视觉,ResNet,卷积神经网络)