ResNet详解(转)
本篇文章涉及到的文献
- Residual Network(ResNet)
- Deep Residual Learning for Image Recognition[arXiv:1512.03385]
- Identity Mappings in Deep Residual Networks[arXiv:1603.05027]
- 2016_tutorial_deep_residual_networks
- ResNet-50 Architecture
- KaimingHe/deep-residual-networks
- CS231n 2017 lecture9
- BIGBALLON/cifar-10-cnn
妹纸:昨天试了一下VGG19,训练时间挺久的,不过效果不错。
花花:呜呜,前几天我们都在讲很基本的网络架构,今天我们讲稍微难一丢丢的。
妹纸:好啊,好啊!我猜是ResNet!
花花:你猜得真准(23333orz)。
最原始的 Residual Network
Residual Network,简称 ResNet(残差网络),是MSRA 何凯明 团队设计的一种网络架构,在2015年的ILSVRC 和 COCO 上拿到了多项冠军,其发表的论文Deep Residual Learning for Image Recognition, 是 CVPR 2016 的最佳论文。
Residual Network的历史从这里开始。
卷积神经网络(Convolutional Neural Network)正不断朝着“Deep”这个方向发展,最早期的LeNet只有5层,后来VGG把深度增加到19层,而我们即将要介绍的ResNet,更是超过了100层。
人们不禁要问:
Is learning better networks as easy as stacking more layers?
不,事实并非如此
只是简单地增加网路的深度,不能得到很好的效果,甚至还会使误差增大:
多个datasets的测试表明,仅仅只是简单地堆叠卷积层,并不能让网络训练得更好。
按理来说,如果网络加深,training acc应该增大,而testing acc减小,但是上图并不是这么回事,于是乎,Kaiming He提出了Deep Residual Learning的架构。
关于残差模块(residual block)
这里Kaiming聚聚首先引入了一个残差模块(residual block)的概念
上图所示的Residual Block:
输入为 ,需要拟合的结果(输出)为 。
那么我们把输出差分为 ,也就是
再令 ,意思是 也是由 拟合而来,
那么最后的输出就变为 本来就是输入,
所以我们就只需要拟合 就好了。
如上图,原始的plain架构,我们用两层卷积层来模拟函数 ,
而在residual block中,我们用两层卷积层来模拟函数
举个例子:
输入 , 经过拟合后的输出为
那么残差就是
如果拟合的是恒等变换,即输入 ,输出还是
那么残差就是
而如上图所示,假设 从 经过两层卷基层(conv)之后变为 ,
平原网络的变化率
而残差模块的变化率为
残差的引入去掉了主体部分,从而突出了微小的变化。我想这是他们敢说
We hypothesize that it is easier to optimize the residual mapping than to optimize
the original, unreferenced mapping
的原因。
有了残差模块(residual block)这个概念,我们再来设计网络架构,
架构很简单,基于VGG19的架构,我们首先把网络增加到34层,增加过后的网络我们叫做plain network,再此基础上,增加残差模块,得到我们的Residual Network
关于bottleneck
论文中有两种residual block的设计,如下图所示:
在训练浅层网络的时候,我们选用前面这种,而如果网络较深(大于50层)时,会考虑使用后面这种(bottleneck),这两个设计具有相似的时间复杂度。
同样举个例子:
对于ImageNet而言,进入到第一个residual block的input为
采用左侧的两个 的卷积层:
参数量为
化简一下:
采用右侧的bottleneck:
参数量为
化简一下:
可以看到它们的参数量属于同一个量级,
但是这里bottleneck占用了整个network的「三层」,而原本只有「两层」,
所以这样就节省了大量的参数,
在大于50层的resnet中,他们使用了bottleneck这种形式。
具体细节如图所示:
如果你还有问题,参考这里 ResNet之Deeper Bottleneck Architectures
Identity mapping 改进
Kaiming He最初的paper,就是上面介绍的部分,但很快,他们又对ResNet提出了进一步的改进,这便是我们接下来要提到的paper:
Identity Mappings in Deep Residual Networks[arXiv:1603.05027]
我们来仔细分析一下Residual Block, 在这篇paper中也被叫为Residual Unit.
对于原始的 Residual Unit(block),我们有如下计算:
表示 第 个Residual Unit的输入, 则代表 第 个Residual Unit的输出
代表的某个变换,在这里是恒等变换,
代表residual function,
代表某种操作,在这里是ReLU
所以可以写成如下形式:
也就是Residual Unit一开始的做法了。
那如果,我们 是恒等变换呢,即 ,那么有:
对于任意一层,我们都能用这个公式来表示:
这便是这篇paper的改进,把原本的ReLU,放到Residual Unit的conv前面去,而不是放在addition之后。
可以看到,在上图作者对cifar10进行的多组实验中,使用full pre-activation这种Residul Unit效果最佳,个人认为这张表格还是挺重要的,我们简单分析一下!
- (a)original:原始的结构
- (b)BN after addition:这是在做相反的实验,本来我们的目的是把ReLU移到旁路上去,这里反而把BN拿出来,这进一步破坏了主路线上的恒等关系,阻碍了信号的传递,从结果也很容易看出,这种做法不ok
- (c)ReLU before addition:将 变为恒等变换,最容易想到的方法就是将ReLU直接移动到BN后面,但这会出现一个问题,一个 (残差函数)的输出应该可以是 ,但是经过ReLU之后就会变为 ,这种做法的结果,也比(a)要差。
直接提上来似乎不行,但是问题反过来想, 在addition之后做ReLU,不是相当于在下一次conv之前做ReLU吗?
- (d)ReLU-only pre-activation:根据刚才的想法,我们把ReLU放到前面去,然而我们得到的结果和(a)差不多,原因是什么呢?因为这个ReLU层不与BN层连接使用,因此无法共享BN所带来的好处。
- (e)full pre-activation:啊,那要不我们也把BN弄前面去,惊喜出现了,我们得到了相当可观的结果,是的,这便是我们最后要使用的Unit结构!!!
代码实现
终于到了可以写代码的时候了,
还是放在我的 Github,测试只是用了50层,
使用GTX980TI,训练时间为 8 h 58 min
最后testing accuracy:94.10%
妹纸:哇,ResNet的residual block好帅气啊,何凯明简直是我男神!
花花:喔,他是所有人心中的男神!
妹纸:要训练9个小时啊,我周末试一下啊
花花:你的是1080TI,训练个毛9小时,我980TI才要9小时啊!!
妹纸:啊,反正是学长给配的
花花:啊,2333
转载于:https://www.cnblogs.com/byteHuang/p/10795996.html
ResNet详解(转)相关推荐
- ResNet详解——通俗易懂版
ResNet学习 什么是ResNet 为什么要引入ResNet? ResNet详细解说 本篇博客主要是自己对论文的一些解读以及参考一些博客后的理解,如若有不对之处,请各位道友指出.多谢! 2015年刚 ...
- 残差网络resnet详解
1 产生背景 网络的深度对于特征提取具有至关重要的作用,实验证得,如果简单的增加网络深度,会引起退化问题[Degradation问题],即准确率先上升然后达到饱和,再持续增加深度会导致准确率下降.该实 ...
- ResNet详解(pytorch)
1 ResNet是2015年就提出的网络结构,中文名字叫作深度残差网络,主要作用是图像分类.现在在图像分割.目标检测等领域都有很广泛的运用. 2 随着硬件的不断升级,我们可以使得原来很浅的网络不断的加 ...
- ResNet详解与分析
文章目录 Resnet要解决的是什么问题 Residual Block的设计 ResNet 网络结构 error surface对比 Residual Block的分析与改进 小结 参考 博客: 博客 ...
- 经典卷积网络进阶--ResNet详解
一.ResNet概述 resnet在2015名声大噪,微软公司提出了一种新的网络结构---残差网络(resnet).残差模块结构图如下图1,图中曲线连接方式(X identity)称为近道连接,这种连 ...
- ResNet详解:ResNet到底在解决什么问题?
原作者开源代码:https://github.com/KaimingHe/deep-residual-networks 论文:https://arxiv.org/pdf/1512.03385.pdf ...
- 【深度学习】ResNet——CNN经典网络模型详解(pytorch实现)
建议大家可以实践下,代码都很详细,有不清楚的地方评论区见~ 1.前言 ResNet(Residual Neural Network)由微软研究院的Kaiming He等四名华人提出,通过使用ResNe ...
- pytorch图像分类篇:6. ResNet网络结构详解与迁移学习简介
前言 最近在b站发现了一个非常好的 计算机视觉 + pytorch 的教程,相见恨晚,能让初学者少走很多弯路. 因此决定按着up给的教程路线:图像分类→目标检测→-一步步学习用pytorch实现深度学 ...
- 程序员新动向!大龄困惑详解!
有一批网易,搜狗,华为等知名互联网公司老员工站出来吐槽,说35岁之后的处境多么尴尬,尤其大数据.人工智能方向,如果资历不够.技术一般一般,每天在公司时刻提心吊胆,生怕被裁员. 1 为何会出现这种现象? ...
最新文章
- python使用psutil获取系统(Windows Linux)所有运行进程信息实战:CPU时间、内存使用量、内存占用率、PID、名称、创建时间等;
- 作为公司新上任的管理者,如何更好的规划工作方案
- 抽象工厂模式java_Java之抽象工厂模式(Abstract Factory)
- linux下载哪个python版本-Linux安装python3.6
- C语言函数题-取子串 (10分)
- P3538-[POI2012]OKR-A Horrible Poem【hash,字符串】
- linux info文件夹,详解Linux系统中查询文档的man和info命令
- 绿屏后再现“粉屏”门!大量网友投诉iPhone 13粉屏问题 客服:非硬件问题
- Spring MVC请求处理流程分析
- 世界名校、大厂人才汇聚,“马栏山杯”算法大赛打造 AI 视频竞技场
- 错误记录:发送广播是报空指针
- Home Assistant系列 -- 设置界面语言与地理位置
- 腾讯前辈熬夜肝了一个月整理的《Linux内核学习笔记》,啃完受益匪浅不走弯路
- 电脑32位和64位有什么区别
- 无线路由器桥接——手机连不上网
- [转载] OpenCV—利用回调函数实现返回鼠标点击位置的坐标和灰度值
- 英语12个月份的英文和缩写
- 防止其他域名指向你的服务器的一种方法
- 注意论文投稿风险,现投期刊会不会成为预警期刊呢?
- 跟我学spring security系列文章第一章 实现一个基本的登入
热门文章
- aspjpeg已过期_Persits.Jpeg.1错误’800a0004′ AspJpeg组件过期解决方法 - YangJunwei
- java后台开发加密程序_Java后端实现MD5加密的方法
- swish 好还是relu好_筒灯暗装好还是明装好?
- 计算机管理游戏,网吧游戏管理系统
- html body最小高度,CSS网页布局中的最小高度问题的解决方法
- linux vps 迁移数据 ip screen ctrl a d,Linux学习笔记之screen命令的使用
- 的引用_懵!啥是Java软引用、弱引用、虚引用?
- 直接添加viewController中的view时的注意事项
- 生成pyd文件时提示“Unable to find vcvarsall.bat”的问题
- Mabatis(2) 全局配置文件