图像分类算法:ResNet论文解读

Posted 自学小白菜

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了图像分类算法:ResNet论文解读相关的知识,希望对你有一定的参考价值。

图像分类算法:ResNet论文解读

前言

​ 其实网上已经有很多很好的解读各种论文的文章了,但是我决定自己也写一写,当然,我的主要目的就是帮助自己梳理、深入理解论文,因为写文章,你必须把你所写的东西表达清楚而正确,我认为这是一种很好的锻炼,当然如果可以帮助到网友,也是很开心的事情。

说明

​ 如果有笔误或者写错误的地方请指出(勿喷),如果你有更好的见解也可以提出,我也会认真学习。

原始论文地址

点击这里,或者复制链接

https://arxiv.org/abs/1512.03385

目录结构

文章目录

1. 背景简介:

​ CNN在快速发展,在短短两三年时间,各种网络层出不穷。而VGG这篇论文表明了深度的重要性,但是在深度重要性的驱动下,一个问题出现了:更好的网络难搞就像堆积木一样堆得越高越好嘛?

​ 回答这个问题的一个障碍是:**梯度消失与梯度爆炸。而这个问题已经被初始化手段(BN)**很大程度的解决了。但是,作者发现当网络随着深度的增加,准确度会饱和,然后迅速退化。

​ 什么意思,如下图(论文原图)所示,深度的增加并没有如我们所想那样,精度也随之增加:

​ 在这种情况下,作者提出了ResNet网络。

2. 文章内容概述:

​ 由于更深层次神经网络更难训练,作者提出了基于残差的学习框架,并借此探索了深层神经网络的准确率,最大的深度甚至达到1000层,而其最佳的模型也在ImageNet上取得了top-5错误率3.57的精度,这个精度已经超过了人类所能达到的标准(我记得好像是5左右),也因此,后面就没有举办该比赛了,但是这个数据集仍然可以被拿来使用。

3. 深层网络退化问题:

​ 作者发现,随着网络深度增加,准确度会饱和,然后迅速退化。

​ 但是,从理论上来说:假设一个浅层模型和另外一个深层模型,其中这个深层模型的前面层都是从浅层模型复制过来的,是恒等映射,那么理论上性能应该更好,因为这相当于你在别人的基础上进一步学习,效果自然应该更好。如下图所示:

​ 但是,实际上,现有的求解器无法如我们所想的那样运作。但这也符合世界的客观规律,因为学习不是一成不变的,即使同一个人在不同的时间点看同一个风景心情也是不同的。

4. 残差框架:

​ 为了一定程度上解决退化问题,作者提出了基于残差的学习框架。

​ 如下图所示(论文原图):

​ 即,我们不希望让对叠层去适应底层映射,而是去适应残差。

​ 说人话,在理论情况下,假设我们的已有的模型输入为x,此时堆叠一层,那么其可以看成学习一个目标函数H(x)的映射。但是退化问题表明了,实际上学的与我们所想可能有点差距。因此,作者希望新增加的层,去学习H(x)与x之间的差值,即这个新增加的层去学习残差H(x)-x。

​ 作者为了实现这个目的,特意添加上图右边的曲线(并且这个曲线并没有增加学习参数),这样模型的输出值为F(x)+x(假设F(x)为残差),即新的层没有直接学习最终目标,而是学习了残差值。

​ 虽然普通的我们也许并清除这样做是否可以解决网络退化问题,但是试验就是最好的证明方法,而作者也采用试验证明了这个方法的确可行。

5. 残差结构形状不一致解决方法:

​ 残差结构有一个问题,就是如果我们的x与F(x)的shape不一致,那么两者是不能相加的。

​ 解决这个问题的方法很多:

  • 为输入输出添加0值,让两者大小一致(不建议
  • 添加1*1卷积层,来改变通道数

6. shortcut connections:

​ 上图中,右边的曲线被作者称为“shortcut connections”,之所以用英文,主要中文翻译起来怪怪的,叫“快捷连接???”。

​ 其特点是:满足要求的同时不增加任何需要学习的参数。

一个问题:能不能只跨一层或者跨多层?

​ 跨多层是可以的,上面图片就跨了三层。不过不建议跨单层,因为跨单层就相当于线性变换了,效果不佳。

因为最后才送入relu函数中,那么跨单层就类似于:H(x) = F(x) + x,其中F(x)=w1*x
而两层的话,F(x) =  w2*ReLU(w1*x)
上面只是随便举个例子,示意一下,勿较真

7. 网络架构介绍:

​ 来自作者的原表格:

​ 这个表格很容易看懂,我只稍微提几点:

  • 为什么上面没有作者尝试的1000层,因为1000层只是作者的初次尝试,里面仍然存在一些问题等待解决(比如作者的1000层效果并不佳,和100层的类似)
  • FLOPs(flop + s): 浮点运算数,是计算量的体现。还有一个类似的是FLOPS(floating-point operations per second),是每秒浮点运算次数,体现了计算速度。(可以从英文单词角度记忆)

​ 另外还有一张图,是ResNet-34的架构,帮助大家辅助理解上表(不过这张图有点小,大家可以把论文下载下来看):

8. 总结:

​ ResNet可以说是图像分类的一个小巅峰,是一个很常用的网络结构 。其主要贡献就是提出残差学习框架,并探索了更深的网络模型,为后面的发展继续开拓了道路。

​ 如果你对使用pytorch实现ResNet感兴趣,可以看我的另外两篇文章,一篇是实现ResNet架构,另外一篇是侧重训练、测试。(必须提一句,前一篇有些笔误的地方,在后一篇中提及并改正了

https://blog.csdn.net/weixin_46676835/article/details/128745885
https://blog.csdn.net/weixin_46676835/article/details/129716004

ResNet论文解读/总结

此文章为深度学习在计算机视觉领域的图片分类经典论文ResNet(Deep Residual Learning for Image Recognition)论文总结。

此系列文章是非常适合深度学习领域的小白观看的图像分类经典论文。系列文章如下:

 AlexNet:AlexNet论文解读/总结_耿鬼喝椰汁的博客-CSDN博客

VGGNet:VGGNet论文解读/总结_耿鬼喝椰汁的博客-CSDN博客

GoogLeNet:GoogLeNet(Inception)v1 论文解读/总结_耿鬼喝椰汁的博客-CSDN博客

ResNet:ResNet论文解读/总结_耿鬼喝椰汁的博客-CSDN博客


文章目录


摘要

      (一)通常情况下,神经网络的深度越深,越难以训练,本文提出了一种残差神经网络来解决这个问题,它的优化更简单,并且可以在深层的神经网络中也相应获得更高的准确度。这种深度残差神经网络在ImageNet等数据集的测试效果均为第一名。

      (二)更深的神经网络更加难以训练,残差网络主要用来减轻训练的网络,这些网络比之前使用的网络都要深得多。

     (三)在ImageNet的的数据集中网络层数达到了152层,前一年夺冠的VGG只有19层。在COCO物体检测数据集上获得了28%的相对改进。

(一)论文要解决问题

(1)论文首先说明:一味地加深网络深度会使得网络达到了一种饱和状态,而导致精度的下降。

(2)在以往的知识中,深度学习层数越深,提取的特征越多。如下图所示,并非网络层数越多越好。引起这部分的原因,这种现象主要是退化:随着网络层数的加深,准确性会达到饱和,梯度传播过程中会逐渐消失,导致无法对前面的网络层权重进行调整,训练误差加大,结果也随之变差。(并非过拟合,如果过拟合,训练的时候误差很小,但是测试的时候误差就很大)

       由下图可以看出,56-layer(层)的网络比20-layer的网络在训练集和测试集上的表现都要差。注意:这里不是过拟合(过拟合是在训练集上表现得好,而在测试集中表现得很差),说明如果只是简单的增加网络深度,可能会使神经网络模型退化,进而丢失网络前面获取的特征。

 (二)解决方法

       为了解决上面提到的退化,引入一个[深度残差网络].gray (理论上深层次网络和浅层的网络性能一样,但现实卷积层层数越到后面会出现退化)

残差深度学习

       本文提出了深度残差学习(deep residual learning)框架来解决上图中的问题,如下图所示,通过前馈神经网络的shortcut connections来跨过一个层或者多个层,将前层的输出直接与卷积层的输出叠加,相当于做了个恒等映射。

       在极端情况下,如果恒等映射最优,可以将残差设置为0就简单地实现了恒等映射。简单来说,残差学习就是将一层的输入与另一层的输出结果一起作为一整个块的输出。

      整体的网络架构如下:使用两层卷积加relu激活函数,经过第一层的时候输出 F(x),之后在经过第二层(此处增加了shortcut connection),将其shortcut connection连接到第二层的激活函数之前,输出结果变为H(x)=F(x)+x(恒等映射)

        大致参数如下:浅层网络的输出为:x,要学习的目标值为H(x),那么就让该层网络学习一个残差目标值F(x) = H(x)- x,最后的输出为F(x) + x, identity 恒等映射。

       残差网络作用:(1)残差网络比较容易优化,普通网络架构(简单的堆叠层)在训练的时候容易出现较高的误差。(2)残差网络随着深度的增加,准确性、精度也会提高

      残差:也就是真实值和预测值的偏差,类似数据的回归,作用:(1)修正上一层的错误。(2)防止梯度消失(以往的线性结构训练,梯度都是越来越小)

残差网络的定义如下:

   (1)当结构块的输入和输出一致时,恒等映射直接叠加到输出上:

 (2)当结构块的输入和输出不一致时,使用x进行线性映射之后,叠加到输出中:

(三) 网络架构

      从Vgg的启发出发,我们构建一个简单的卷积神经网络。(后两个网络以全局平均池化层和具有softmax的1000维全连接层结束。 左:作为参考的VGG-19模型。中:具有34个参数层的简单网络 。右:具有34个参数层的残差网络 。)

      用两个设计规则设计出我们的残差网络:(1)对于相同的输出特征图尺寸,层具有相同数量的滤波器;   (2) 如果特征图尺寸减半,则滤波器数量加倍,以便保持每层的时间复杂度。我们通过步长为2的卷积层直接执行下采样。

     (一)VGG19的架构:(1).总共有5个block组成,所有的卷积都是3*3, block的卷积核个数以此为64、128、256、512、512 。(2)每个block之间通过下采样。 (3)特征图减半,步长加倍。(4)最后使用两个全连接层(输出1000个类别的概率).

    (二)Plain Network:受VGG网络(如下图左图)的影响,plain网络(如下图中间)的卷积层主要是3*3的滤波器,加权层的层数为34,在网络的最后是全局的平均pooling层和一个1000种类的包含softmax函数的全连接层。plain网络比VGG网络有更少的滤波器(卷积核后面的64,128,256等代表个数)和更低的计算复杂度。

   (三)Residual Network:在plain网络的基础上,加入shortcut连接,就变成了相应的残差网络,如上图右图所示,图中所加实线表明可以直接使用恒等shortcuts,虚线表示维度不匹配时的情况,需要先调整维度再相加。      调整维度的方法有两种:  (1)仍然使用恒等映射,只是在增加的维度上使用0来填充,这种方法不会引入额外的参数;    (2)使用1x1的卷积映射shortcut来调整维度保持一致。         (这两种方法都使用stride为2的卷积。)

(四)实验

      下面是基于ImageNet2012数据集进行评估实验,训练集包含128万张图像,验证集包含5万张图像,测试集有10万张图像,对top-1和top-5的错误率来评估。

plain网络:

      首先进行的实验是18层和34层的plain网络,实验结果如下表所示,产生了一种退化现象:在训练过程中34层的网络比18层的网络有着更高的训练错误率。 

 残差网络:

       接着对18层和34层的残差网络进行评估,为了保证变量的一致性,其基本框架结构和plain网络的结构相同,只是在每一对卷积层上添加了shortout连接来实现残差结构,对于维度不匹配的情况,使用0来填充维度(即上面介绍过的方法),因此也并没有添加额外的参数。训练效果如下图:

        结合下表验证集上的top-1错误率与前面两个表格,可以对比得到:

(1)与plain网络相反,34层的resnet网络比18层的错误率更低,表明可以通过增加深度提高准确率,解决了退化问题。

(2)与plain网络相比,层次相同的resnet网络二错误率更低,这也说明残差网络在深层次下仍然有效。

(3)对于18层的plain网络,它和残差网络的准确率很接近,但是残差网络的收敛速度要更快。

 (五)深度瓶颈结构(bottleneck)

       接下来介绍层次更多的模型,对于每一个残差块,不再使用两层卷积,而是使用三层卷积来实现,如下图所示。只需要将34层resnet网络中的残差模块从2层换成3层,整个网络就变成了50层的resnet。

       先用1x1降维,再用3x3处理数据,再用1x1升维。(结构主要用于Restnet50/101/152)

       实验结果表明 50/101/152层的resnet比34层resnet的准确率要高很多,解决了深层的退化问题。同时即使是152层resnet的计算复杂度仍然比VGG-16和VGG-19要小。

(六)总结

1、退化现象定义:随着网络深度的增加,准确率开始达到饱和并且在之后会迅速下降。

      判断方法:随着网络的加深,错误率不降反升,收敛速率也呈指数级下降。

      原因:网络过于复杂,训练不加约束。

      解决方案:使用残差网络结构。

2、在残差网络中得出的结论:(1)极深残差网络易于优化收敛;(2)解决了退化问题;(3)可以在很深的同时提升准确率。

3、本文提出两种残差结构,一种是两层卷积残差块,应用于ResNet-18和ResNet-34; 另一种是bottleneck三层卷积残差块(分别为1x1降维、3x3、1x1升维)。应用于ResNet-50、ResNet-101和ResNet-152。ResNet-50、ResNet-101、ResNet-152性能都比ResNet-34好。

4.论文成果:基于深度残差网络,在ILSVRC和COCO 2015竞赛中获得了多个赛道的第一名:ImageNet检测、ImageNet定位、COCO检测和COCO分割。

5.数据集:基于ImageNet2012数据集进行评估实验,训练集包含128万张图像,验证集包含5万张图像,测试集有10万张图像,对top-1和top-5的错误率来评估。开源了。


今天的学习总结就到这里啦!如果有什么问题可以在评论区留言呀~

如果帮助到大家,可以一键三连+关注 支持下~

以上是关于图像分类算法:ResNet论文解读的主要内容,如果未能解决你的问题,请参考以下文章

基于resnet和jaccard算法的垃圾分类系统的设计与实现(论文+程序设计源码)

小白学习PyTorch教程十四迁移学习:微调ResNet实现男人和女人图像分类

SeNet论文解读/总结

GoogLeNet(Inceptionv1) 论文解读/总结

Computer Vision基于ResNet-50实现CIFAR10数据集分类

Python 计算机视觉(十七)—— 基于KNN的图像分类