resnet论文阅读
论文阅读:Deep Residual Learning for Image Recognition
引言:
残差网络是如今运用极为广泛的一种网络,它学习残差函数,而非学习原始函数。实验表明残差函数更容易优化,并且可以通过增加深度来提高准确度。它在ILSVRC2015分类任务中获得了第一名,在COCO目标检测数据集上获得了28%的相对改进,赢得了ImageNet检测、ImageNet本地化、可可检测和可可分割等任务的第1个位置。
论文地址:https://arxiv.org/abs/1512.03385
Code:https://github.com/KaimingHe/deep-residual-networks
该论文介绍了残差网络,主要分为3大块:
一、残差块的介绍
二、残差块的原理
三、实验结果
一、残差块介绍:
因为深度在很多视觉识别任务中具有非常核心的重要性,很多网络变得很深,随着深度的增加出现了一个新问题,梯度爆炸与梯度消失。
利用归一初始化与中间初始化(Batch Normalization)可以解决这个问题,如图即为归一初始化与中间初始化,简而言之就是在输入前进行标准化,同时在每个输出层之后对输出进行标准化。
标准化:
1、x先经过Wh1的线性变换后得到s1
2、将s1再减去batch的平均值μB
3、将s2乘以γ调整数值大小,再加上β增加偏移后得到s3, γ与β是训练网络是学来的
解决了梯度消失与梯度爆炸后,又出现了网络退化问题,由图可知56层网络比20层的网络错误率更高,这种退化并不是由过拟合造成的,并且在一个合理的深度模型中增加更多的层却导致了更高的错误率,基于这个问题,提出了残差网络。
二、残差块原理:
左边为原始的网络模块,右边为残差块。
H(x)是底层映射
F(x)多层堆叠的非线性层来拟合的映射
x是原始映射
原始的网络直接拟合所需要的函数,而残差块则拟合残差函数,即:F(x)=H(x)−x,F(x)它拟合的是底层映射与输入的差值,最后通过把输入与残差相加求得底层映射,间接拟合所需要的函数,即:H(x)=F(x)+x。相加操作是通过一条shortcut来实现,Shortcut的作用是简单地执行恒等映射,将恒等映射的输入添加到堆层的输出。论文的作者认为:尽管这两种形式都应该能够逐渐地近似期望的函数,但学习的轻松度是不同的。
F(x)拟合残差函数,F(x)=H(x)−x=F(x;{wi}),这里残差块里的层数个数是两层,残差函数可以表示为:F=W2σ(W1x),数据输入先经历第一层卷积,然后标准化(Batch Normalization),进行非线性**,**函数是(ReLU),再把它输入到第二层卷积,再经历标准化(Batch Normalization),再进行非线性**,同样**函数为(ReLU)。
在残差块中,卷积层不会对图片的尺寸进行改变,卷积中pad为1,卷积核为3*3,步幅为2,所以图片大小不会改变,在卷积中间插有几个池化层,通过这个进行图片尺寸的缩小。
shortcut连接分为两种,一种是输入与输出维度相同,这种情况下,两者可以直接相加,如图中的BB1,第二种是输入与输出维度不同,这种情况下,两者不可直接相加,如图中BB2
在BB1中只有卷积层,图片大小没有改变,可以直接相加:y=F(x)+x
在BB2中,图片尺寸缩小了一半,,因此不可以直接相加:y=F(x)+Wsx.论文的作者给了两种解决方法:
1)shortcut仍然使用恒等映射,在增加的维度上使用0来填充,这样做不会增加额外的参数;
2)使用一个投影矩阵Ws来匹配维度(通过1×1卷积)
对于方法二作者提出了另外一种方法,不是仅仅对于维度不同的shortcut使用方法二,而是对于所有的shortcut使用方法二,但是由于为了减少计算量与复杂度,放弃了这种方法。
残差块中的卷积层个数可以改变,(但是不可以是一层)这里把两层的卷积层改为3层:
第一个1*1的卷积64个是为了降低维度从256降到64个
第二个3*3的层来减少输入和输出的维度
第三个1*1的卷积256个是为了恢复维度,从64恢复到256个
作者这样做是为了减少计算量,使网络可以达到更深的程度
三、实验结果
ImageNet:
论文的作者首先测试了18层与34层的plain网络与resnet网络(使用方法一来解决维度的不同),实验表明:
1)34层的plain网络比18plain层的网络具有更高的错误率
2)与plain网络相反,34层的ResNet比18层ResNet的结果更优(2.8%),错误率更低
作者对于shortcut的三种方法做了实验进行比较:
A:对增加的维度使用0填充
B:对增加的维度使用映射shortcuts,其它使用恒等shortcuts
C:所有的都是映射shortcuts
实验表明:
1)三种选项的模型都比对于的plain模型要好
2)B略好于A
3)C略好于B
但是作者不考虑第三种方法,他为了减少复杂度和模型尺寸,并不使用选项C的模型
作者把resnet网络与其他网络做了对比,结果他的ResNet取得了非常好的结果
在里ResNet-50/101/152是利用了三层结构代替残差块的二层结构,使网络达到了更深的程度,从实验中可以看出深度越深效果越好,错误率越低。
cifar-10
作者首先用cifar-10针对20层、32层、44层、56层的plain网络与resnet网络(用方法一解决维度不同)做了实验,实验结果如图所示,结果与ImageNet的实验结果一样:深度plain网络随着层数的加深,训练错误率也变大;随着resnet网络深度加深,准确率也得到了提升。
但是实验也发现了resnet的一个缺点,当层数到达1202时,错误率比层数为110的高。
作者还用cifar-10把resent与其他深层窄模型,如FitNet和 Highway做了对比(如图)
结果:具有更少的参数,然而却达到了最好的结果
PASCAL and MS COCO
作者采取Faster R-CNN作为检测方法,用resnet-101替换VGG-16,实验结果都表明resnet-101的结果都比VGG-16来的好,特别是在COCO标准度量上获得了6%的增加([[email protected].5,.95])相对改进了28%。