【深度学习之ResNet】——深度残差网络—ResNet总结

 

目录

 

论文名称:Deep Residual Learning for Image Recognition 

摘要:

1、引言

2、为什么会提出ResNet残差网络呢?

3、深度残差网络结构学习(Deep Residual learning)

  (1)残差单元

  (2)恒等映射/单位映射(identity mapping)

  (3)瓶颈(BottleNeck)模块

  (4)ResNet的结构

   (5)ResNet的进一步改进

参考博客:


转载:https://www.cnblogs.com/xiaoboge/p/10539884.html(个人觉得这篇博客写的很详细,对于残差网络的原理和优势进行了详细的解释)

红色部分为自己添加

论文名称:Deep Residual Learning for Image Recognition 

 作者:微软亚洲研究院的何凯明等人             论文地址:https://arxiv.org/pdf/1512.03385v1.pdf

摘要:

  随着人们对于神经网络技术的不断研究和尝试,每年都会诞生很多新的网络结构或模型。这些模型大都有着经典神经网络的特点,但是又会有所变化。你说它们是杂交也好,是变种也罢,总之针对神经网络的创新的各种办法那真叫大开脑洞。而这些变化通常影响的都是使得这些网络在某些分支领域或者场景下表现更为出色(虽然我们期望网络的泛化性能够在所有的领域都有好的表现)。深度残差网络(deep residual network)就是众多变种中的一个代表,而且在某些领域确实效果不错,例如目标检测(object detection)。  

1、引言

  2015年时,还在MSRA的何恺明祭出了ResNet这个“必杀技”,在ISLVRC和COCO上“横扫”了所有的对手,可以说是顶级高手用必杀技进行了一场杀戮。除了取得了辉煌的成绩之外,更重要的意义是启发了对神经网络的更多的思考。可以说深度残差网络(Deep residual network, ResNet)的提出是CNN图像史上的一件里程碑事件。

  ResNet的作者何恺明获得了CVPR2016最佳论文奖。那么ResNet为什么会如此优异的表现呢?其实ResNet是解决了深度CNN模型难训练的问题,我们知道2014年的VGG才19层,而15年的ResNet多达152层,这在网络深度完全不是一个量级上,所以如果是第一眼看到这个层数的话,肯定会觉得ResNet是靠深度取胜。事实当然是这样,但是ResNet还有架构上的trick,这才使得网络的深度发挥出作用,这个trick就是残差学习(Residual learning)。接下来我们将详细分析ResNet的原理。

 

2、为什么会提出ResNet残差网络呢?

add:

        VGGNet和Inception出现后,大家都想着通过增加网络深度来寻求更加优秀的性能,但是网络的加深也带来了一定的困难,如:

        1)网络加深导致参数增加,导数网络难以训练

        2)因为网络太深,导致根据梯度链条传递原则,使得传播到浅层时,梯度消失;也可能出现梯度爆炸的情况,但是通过BN层归一化到【0,1】之间已经很好地解决了梯度爆炸的现象

        3)越深的网络梯度相关性差,接近白噪声,导致梯度更新也接近于随机扰动

        综上可知:要想更加深的网络进行训练,并且获得良好的性能,我们首要需要解决的就是使得深层的梯度能够传递到浅层来,这样才能使得网络参数能够有效的更新,其实就是抑制梯度损失

VGG网络试着探寻了一下深度学习网络的深度究竟可以深到何种程度还可以持续提高分类的准确率。对于传统的深度学习网络,我们普遍认为网络深度越深(参数越多)非线性的表达能力越强,该网络所能学习到的东西就越多。我们凭借这一基本规则,经典的CNN网络从LetNet-5(5层)和AlexNet(8层)发展到VGGNet(16-19),再到后来GoogleNet(22层)。根据VGGNet的实验结果可知,在某种程度上网络的深度对模型的性能至关重要,当增加网络层数后,网络可以进行更加复杂的特征模式的提取,所以当模型更深时理论上可以取得更好的结果,从图1中也可以看出网络越深而效果越好的一个实践证据。

                                                图1:VGGNet网络结构和实验结果

   但是更深的网络其性能一定会更好吗?我们后来发现传统的CNN网络结构随着层数加深到一定程度之后,越深的网络反而效果更差,过深的网络竟然使分类的准确率下降了(相比于较浅的CNN而言)。比较结果如图2。

 

图2:常规的CNN网络过分加深网络层数会带来分类准确率的降低

  

  为什么CNN网络层数增加分类的准确率却下降了呢?难道是因为模型参数过多表达能力太强出现了过拟合?难道是因为数据集太小出现过拟合?显然都不是!!!我们来看,什么是过拟合呢?过拟合就是模型在训练数据上的损失不断减小,在测试数据上的损失先减小再增大这才是过拟合现象。根据图2 的结果可以看出:56层的网络比20层网络在训练数据上的损失还要大。这可以肯定不会是过拟合问题。因此,我们把这种问题称之为网络退化问题(Degradation problem)。

  我们知道深层网络存在着梯度消失或者爆炸的问题,这使得深度学习模型很难训练。但是现在已经存在一些技术手段如BatchNorm来缓解这个问题。因此,出现深度网络的退化问题是非常令人诧异的。

  何恺明举了一个例子:考虑一个训练好的网络结构,如果加深层数的时候,不是单纯的堆叠更多的层,而是堆上去一层使得堆叠后的输出和堆叠前的输出相同,也就是恒等映射/单位映射(identity mapping),然后再继续训练。这种情况下,按理说训练得到的结果不应该更差,因为在训练开始之前已经将加层之前的水平作为初始了,然而实验结果结果表明在网络层数达到一定的深度之后,结果会变差,这就是退化问题。这里至少说明传统的多层网络结构的非线性表达很难去表示恒等映射(identity mapping),或者说你不得不承认目前的训练方法或许有点问题,才使得深层网络很难去找到一个好的参数去表示恒等映射(identity mapping)。

 

3、深度残差网络结构学习(Deep Residual learning)

  (1)残差单元

  这个有趣的假设让何博士灵感爆发,他提出了残差学习来解决退化问题。对于一个堆积层结构(几层堆积而成)当输入为x时其学习到的特征记为H(x),现在我们希望其可以学习到残差F(x) = H(x) - x,这样其实原始的学习特征是H(x)。之所以这样是因为残差学习相比原始特征直接学习更容易。当残差为F(x) = 0时,此时堆积层仅仅做了恒等映射,至少网络性能不会下降,实际上残差不会为0,这也会使得堆积层在输入特征基础上学习到新的特征,从而拥有更好的性能。残差学习的结构如图3所示。这有点类似与电路中的“短路”,所以是一种短路连接(shortcut connection)


图3:残差学习单元

  为什么残差学习相对更容易,从直观上看残差学习需要学习的内容少,因为残差一般会比较小,学习难度小点。不过我们可以从数学的角度来分析这个问题,首先残差单元可以表示为:

 

其中,XL和XL+1分别表示第L个残差单元的输入和输出,注意每个残差单元一般包含多层结构。F是残差函数,表示学习到的残差,而h(XL) = XL表示恒等映射,f 是ReLu激活函数。基于上式,我们求得从浅层 l 到深层 L 的学习特征。

 

 我们可以知道,对于传统的CNN,直接堆叠的网络相当于一层层地做——仿射变换-非线性变换,而仿射变换这一步主要是矩阵乘法。所以总体来说直接堆叠的网络相当于是乘法性质的计算。而在ResNet中,相对于直接堆叠的网络,因为shortcut的出现,计算的性质从乘法变成了加法。计算变的更加稳定。当然这些是从前向计算的角度,从后向传播的角度,如果代价函数用Loss表示,则有

增加短路连接shortcut_connection后的梯度(1表示能够将损失无损地传递到上一层,而残差项需要经过w卷积层等,结合图3:残差学习单元来理解)

未增加短路连接的梯度表达式(当网络很深时传到浅层残差会很小,导致梯度会有消失的风险):


                       

下面这段话很重要,因为通过一个短路连接使得梯度能够比较完整的传递到上一层,虽然有残差项,但是梯度比没有短路前更加完整,从而使得梯度的衰减进一步得到了抑制,这样使得从深层反向传播回来的梯度不至于消失,这也为增加更多层实现更深层的神经网络提供了可行性的保障。

也就是说,无论是哪层,更高层的梯度成分都可以直接传过去。小括号中的1表明短路机制(shortcut)可以无损地传播梯度,而另外一项残差梯度则需要经过带有weights的层,梯度不是直接传递过来的。残差梯度不会那么巧全为-1,而且就算其比较小,有1的存在也不会导致梯度消失。这样一来梯度的衰减得到进一步抑制,并且加法的计算让训练的稳定性和容易性也得到了提高。所以可训练的网络的层数也大大增加了。

  (2)恒等映射/单位映射(identity mapping)

  我们知道残差单元通过 identity mapping 的引入在输入和输出之间建立了一条直接的关联通道,从而使得强大的有参层集中学习输入和输出之间的残差。一般我们用F(X, Wi)来表示残差映射,那么输出即为:Y = F(X, Wi) + X 。当输入和输出通道数相同时,我们自然可以如此直接使用X进行相加。而当它们之间的通道数目不同时,我们就需要考虑建立一种有效的 identity mapping 函数从而可以使得处理后的输入X与输出Y的通道数目相同即Y = F(X, Wi) + Ws*X

  当X与Y通道数目不同时,作者尝试了两种 identity mapping 的方式。一种即简单地将X相对Y缺失的通道直接补零从而使其能够相对齐的方式,另一种则是通过使用1x1的conv来表示Ws映射从而使得最终输入与输出的通道达到一致的方式

  (3)瓶颈(BottleNeck)模块

  如下图4所示,左图是一个很原始的常规模块(Residual block),实际使用的时候,残差模块和Inception模块一样希望能够降低计算消耗。所以论文中又进一步提出了“瓶颈(BottleNeck)”模块,思路和Inception一样,通过使用1x1 conv来巧妙地缩减或扩张feature map维度(也就是改变channels通道数)从而使得我们的3x3 conv的filters数目不受外界即上一层输入的影响,自然它的输出也不会影响到下一层module。不过它纯是为了节省计算时间进而缩小整个模型训练所需的时间而设计的,对最终的模型精度并无影响。

 

图4:BottleNeck模块

  (4)ResNet的结构

创新点:

1)短路连接,使得梯度消失得到了一定的改善

2)图像输入直接使用了步长为2进行下采样

3)使用全局平均池化代替了全连接层

4)当特征图大小发生倍数变化时,其个数也会发生相应的倍数变换,比如大小减半则数量会增倍,保证了网络结构的复杂度

何为全局平均池化?

全局平均池化其实就是将最后一层每个通道取均值,最终变成channels * 1 * 1的一维格式,这样的效果和全连接层是一致的

图片来自:https://blog.csdn.net/weixin_37721058/article/details/96573673

  ResNet网络是参考了VGG19的网络,在其基础上进行了修改,并通过短路机制加入了残差单元,如图5所示。变化主要体现在ResNet直接使用stride=2的卷积做下采样,并且用global average pool层替换了全连接层。ResNet的一个重要设计原则是:当feature map大小降低一半时,featuremap的数量增加一倍,这保持了网络层的复杂度。从图5中可以看到,ResNet相比普通网络每两层间增加了短路机制,这就形成了残差学习,其中虚线表示featuremap数量发生了改变。图5展示的34-layer的ResNet,还可以构建更深的网络如表1所示。从表中可以看到,对于18-layer和34-layer的ResNet,其进行的两层间的残差学习,当网络更深时,其进行的是三层间的残差学习,三层卷积核分别是1x1,3x3和1x1,一个值得注意的是隐含层的feature map数量是比较小的,并且是输出feature map数量的1/4。

图5 ResNet网络结构图

 

表1 不同深度的ResNet

0?wx_fmt=png

 

  下面我们再分析一下残差单元,ResNet使用两种残差单元,如图6所示。左图对应的是浅层网络,而右图对应的是深层网络。对于短路连接,当输入和输出维度一致时,可以直接将输入加到输出上。但是当维度不一致时(对应的是维度增加一倍),这就不能直接相加。有两种策略:

(1)采用zero-padding增加维度,此时一般要先做一个downsamp,可以采用strde=2的pooling,这样不会增加参数;

(2)采用新的映射(projection shortcut),一般采用1x1的卷积,这样会增加参数,也会增加计算量。短路连接除了直接使用恒等映射,当然都可以采用projection shortcut。

图6 不同的残差单元

作者对比18-layer和34-layer的网络效果,如图7所示。可以看到普通的网络出现退化现象,但是ResNet很好的解决了退化问题。

0?wx_fmt=png

图7 18-layer和34-layer的网络效果

  最后展示一下ResNet网络与其他网络在ImageNet上的对比结果,如表2所示。可以看到ResNet-152其误差降到了4.49%,当采用集成模型后,误差可以降到3.57%。

表2 ResNet与其他网络的对比结果

0?wx_fmt=png

 

   (5)ResNet的进一步改进

   在2015年的ILSVRC比赛获得第一之后,何恺明对残差网络进行了改进,主要是把ReLu给移动到了conv之前,相应的shortcut不在经过ReLu,相当于输入输出直连。并且论文中对ReLu,BN和卷积层的顺序做了实验,最后确定了改进后的残差网络基本构造模块,如下图8所示,因为对于每个单元,激活函数放在了仿射变换之前,所以论文叫做预激活残差单元(pre-activation residual unit)。作者推荐在短路连接(shortcut)采用恒等映射(identity mapping)。

 

图8 改进后的残差单元及效果

参考博客:

 

你必须要知道的CNN模型ResNet:https://blog.csdn.net/u013709270/article/details/78838875

经典分类CNN模型系列其四https://www.jianshu.com/p/93990a641066

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/255979.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Atitit.  c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0   attilax总结

Atitit. c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0 attilax总结 1.1. C# 1.0-纯粹的面向对象 1.2. C# 2.0-泛型编程新概念 1.3. C# 2.0的另一个突出的特性就是匿名方法 1.4. C#3.0 linq 1.5. C# 4.0动态编程 dynamic 1.6. C# 4.5 异步编程 async和await 1.7. C# 5.0 更方便…

关于SafeMove White Paper功能

ABB机器人网站有一个 Safemove 功能的介绍,在Overview页面右半版有一篇文档是 SafeMove White Paper ,在45页的 pdf 文档中,详细了介绍工业机器人的安全原则,以及ABB工业机器人自身 EPS (Electronic Position Switches) 和 SafeMo…

面试疑难点解析

List,Set,Map,有什么区别? List和Set实际上市实现了Collection接口,那么Collection接口的原理你能简单描述一下吗? List接口可以插入多个NULL值,并且重复值,而且LIST是一个有序的集合。 Set是一个不可重复的集合&#…

【深度学习】——日常知识点总结(持续更新)

设计卷积网络的原则: 1、最后转为一维有两种方式:1)全局平均池化;2)扁平化直接转化为一维的 2、在卷积层的大小变化时尽量保证特征图大小减小n倍时,特征图的个数也增加n倍,维持网络的复杂度&a…

主机无法访问虚拟机的httpd服务

症状:虚拟机装的centos6.3 通过桥接的方式与主机连接 虚拟机通过yum安装httpd服务 在主机浏览器中输入 虚拟机ip 无法访问虚拟机Apache 虚拟机和主机可以相互ping通 解决:关掉虚拟机的防火墙就可以了 命令setup进入防火墙管理 按空格键取消防火墙启用 转…

越狱Season 1- Episode 22: Flight

Season 1, Episode 22: Flight -Franklin: You know you got a couple of foxes in your henhouse, right? fox: 狐狸 henhouse: 鸡舍 你的队伍里都是一群狐狸 -Michael: They both want out of here. both: 两者都 他们都想出去 Theyll behave until then. behave: 举止端…

巴科斯范式BNF: Backus-Naur Form介绍

巴科斯范式(BNF: Backus-Naur Form. 的缩写)是由 John Backus 和 Peter Naur 首次引入一种形式化符号来描述给定语言的语法(最早用于描述ALGOL 60 编程语言)。 现在,几乎每一位新编程语言书籍的作者都使用巴科斯范式来定义编程语言的语法规则…

2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结

2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结 对“第二章 信息的表示和处理”的深入学习 这周的任务是选一章认为最重要的进行学习,我选择了第二章。当今的计算机存储和处理信息基本上是由二进制(位)组成,二进…

【VOC格式xml文件解析】——Python

#!/usr/bin/env python # -*- coding: utf-8 -*- # Time : 2021/4/26 12:49 # Author : linlianqin # Site : # File : test1.py # Software: PyCharm # description: import xml.etree.ElementTree as ETdef xmli(xmlpath):xmlTree ET.parse(xmlpath) # 解析xml文…

C—的BNF语法

近期用到ABB机器人&#xff0c;RAPID使用BNF语法规则描述&#xff0c;所以不得不复习了一下BNF语法描述规则&#xff0c;通过C的BNF描述&#xff0c;唤醒我的记忆 %>_<% C—的BNF语法如下&#xff1a; 1. program → declaration-list 2. declaration-list → decla…

Warning: Attempt to present on whose view is not in模态跳转问题

错误分析&#xff1a; controller A present controller B ,前提是A的view要存在&#xff0c;如果不存在&#xff0c;就会报这个错。解决方法&#xff1a; 将原来的present语句由 viewDidLoad方法中移到 viewDidAppear中&#xff0c;问题就可以解决。但是这样的话&#xff0c;画…

Reflector7及破解

Reflector7开始收费&#xff0c;前面的版本都已经过期&#xff0c;在网上下载了Reflector7&#xff0c;并找到了破解软解&#xff0c;特在此分享。 下载地址&#xff1a; Reflector7.1.0.143.zip&Red.Gate_.NET_.Reflector.7.1.0.143.patch-SND.zip 本文转自xwdreamer博客园…

win7系统的右键菜单只显示一个白色框不显示菜单项 解决办法

如上图所示&#xff0c;桌面或其他大部分地方点击右键菜单&#xff0c;都只显示一个白色框&#xff0c;鼠标移上去才有菜单项看&#xff0c;并且效果很丑 解决办法&#xff1a; 计算机—右键—属性—高级—性能—设置—视觉效果—淡入淡出或滑动菜单到视图&#xff0c;将其前面…

【setup.py编译出错】——提示无法查找到powershell.exe

https://www.cnblogs.com/wind-chaser/p/11359521.html pytorch fasterrcnn训练自己数据集文章链接 在进行faster rcnn pytorch跑通的时候遇到的&#xff0c;我是直接在pycharm中的终端上进行运行的&#xff0c;但是一直会跳出powershell.exe无法查找的错误&#xff0c; pytho…

同工不同酬,年薪 50 万美金的工程师到底有什么神本事?

同工不同酬&#xff0c;年薪 50 万美金的工程师到底有什么神本事&#xff1f;投递人 itwriter 发布于 2014-05-10 23:09 评论(6) 有6066人阅读 原文链接 [收藏] 英文原文&#xff1a;What kind of jobs do the software engineers who earn $500K a year do? 他们究竟是作…

201671010117 2016-2017-2 《Java程序设计》Java第十七周学习心得

Java第十七周学习心得 这一周老师对线程的内容进行了详细讲解&#xff0c;包括线程创建的两种技术&#xff0c;和线程的优先级属性及调度方法&#xff0c;对于布置的实验作业中&#xff0c;实验九中存在一点问题&#xff0c;程序运行不出来&#xff0c;后来跟同学商量探讨没有…

ACM数论之旅4---扩展欧几里德算法(欧几里德(・∀・)?是谁?)

为什么老是碰上 扩展欧几里德算法 ( •̀∀•́ )最讨厌数论了 看来是时候学一学了 度娘百科说&#xff1a; 首先&#xff0c; axby gcd(a, b) 这个公式肯定有解 &#xff08;( •̀∀•́ )她说根据数论中的相关定理可以证明&#xff0c;反正我信了&#xff09; 所以 axby g…

艾里斑大小与像元尺寸的匹配问题

写给自己看的学习记录&#xff1a; 光具有波粒二象性&#xff0c;由此衍生出了几何光学与衍射光学。在光学设计软件中&#xff0c;最常用的判断标准是查看点列图的RMS半径以及MTF图的曲线&#xff0c;这两者分别代表了两种传播性质的评价方式。 在刚接触光学设计时&#xff0…

Android 保持Service不被Kill掉的方法--双Service守护 Android实现双进程守护

本文分为两个部分&#xff0c;第一部分为双Service守护&#xff0c;第二部分为双进程守护 第一部分&#xff1a; 一、Service简介&#xff1a;Java.lang.Object ↳Android.content.Context ↳android.content.ContextWrapper ↳android.app.Service Service是应用程序Applicati…

【mmdetection2.0错误】——ModuleNotFoundError: No module named ‘mmdet‘

一开始以为是安装包导入的相对路径的问题&#xff0c;结果鼓捣了一上午都没有用&#xff0c;最后才发现再进行mmdet2.0环境配置的时候忘记编译了 也就是如下语句&#xff1a; python setup.py develop