Deep Residual Network学习(一)
来源:互联网 发布:乐清市知临学校招聘 编辑:程序博客网 时间:2024/06/07 18:42
1.论文解读
He首先提出一个问题:Is learning better networks as easy as stacking more layers?回答这个问题的一个障碍在于一个著名的问题:梯度消失/爆炸,然而这个障碍可以通过合理的初始化和其他一些技术来解决,接下来看一张图:
这是我在论文结果复现时在CIfar10上复现的训练过程图,plain-20代表不含残差结构的纯粹的20层的网络结构,很明显可以看出随着网络深度增加,performance却在下降。He将这一现象称为degradation,亦即随着网络深度的增加,准确度饱和并且迅速减少。这一问题广泛存在于深层的网络结构中,例如VGG的论文中也观察到这一现象。degradation表明不是所有的系统都能很容易地被优化。
接下来,He提出了深度残差学习的概念来解决这一问题。首先我们假设我们要求的映射是H(x),通过上面的观察我们意识到直接求得H(x)并不那么容易,所以我们转而去求H(x)的残差形式F(x)=H(x)-x,假设求F(x)的过程比H(x)要简单,这样,通过F(x)+x我们就可以达到我们的目标,简单来说就是下面这幅图,我们将这个结构称之为一个residual block。
相信很多人都会对第二个假设有疑惑,也就是为什么F(x)比H(x)更容易求得,关于这一点,论文中也没有明确解释。但是根据后面的实验结果确实可以得到这一个结论。
“Our deep residual nets can easily enjoy accuracy gains from greatly increased depth, producing results substantially better than previous networks.”
这里放上Kaiming大神论文中的一句话,大家自行感受即可...
2.网络结构
接下来让我们关注一下ResNet的网络结构:
PlainNet结构主要基于VGG修改而得到,接下来我们重点关注ResNet结构。可以发现,主要结构与PlainNet一致,只是多了许多shortCut连接,可以发现,通过shortcut,整个ResNet就可以看成是许多个residual block堆叠而成。这里值得注意的是虚线部分,虚线部分均处于维度增加部分,亦即卷积核数目倍增的过程,这时进行F(x)+x就会出现二者维度不匹配,这里论文中采用两种方法解决这一问题(其实是三种,但通过实验发现第三种方法会使performance急剧下降,故不采用):
A.zero_padding:对恒等层进行0填充的方式将维度补充完整。这种方法不会增加额外的参数
B.projection:在恒等层采用1x1的卷积核来增加维度。这种方法会增加额外的参数
3.结果复现
暂时还没有在ImageNet上复现ResNet结果,因为太耗时了喂,听师兄说152层的ResNet在ImageNet12上要跑一个月:(,等以后有时间在尝试吧。接下来的部分均是ResNet在Cifar10上的复现结果,所有的实验都是在caffe上完成的。
依据论文中结构,所有的卷积核都是3x3的,依据上表总共是6n+2层,n代表residual block的数目。注意:在论文中cifar10上对所有的恒等层均采用A方法,但由于caffe暂时不支持zero_padding,所以在本文中结果均采用B方法。A方法我最终也进行了复现,但这需要向caffe中添加新层,留待下次再写吧。
数据预处理部分论文中采取对图像各边扩展4个pixels的方式,亦即将32x32图像扩展成40x40的图像,训练时再随机crop一个32x32的部分进行训练,但这里暂时没有进行这个操作,因为刚开始对CV的很多操作还不是很熟悉,所以采取了原始的32x32的图像截取28x28图像的方式。
接下来就是一些训练参数的设置了,如下:
weight_decay=0.0001momentum=0.9
batch_size=100
learning_rate=0.1,0.01/40k,0.001/80k
max_iter=100k
接下来就是实验的结果图了:
先是PlainNet,下面一张是限制y轴取值后得到的细节图片,很明显可以看出degradation问题:随着网络层数的增加,accuracy不增反降
接下来就是万众瞩目的ResNet了,上面的那张图可能不太清楚,可以看一下下面的细节图,这时候可以明显看出residual block的威力了,解决了degradation的问题,这样我们可以充分享受深度深度带来的perfomance的提升!
下面放一张我前期所有实验所得到的结果表:PlainNet明显显现出degradation的问题,下面我们重点看ResNet,这里我实验了三种初始化方法,第一种是均值为0,标准差为0.01的高斯分布,第二种是论文中所使用的初始化方法,亦即msra方法(https://arxiv.org/abs/1502.01852),第三种就是xavier了,可以看出:
1.对三种初始化方法,随着深度增加,accuracy均得到提升
2.msra的初始化方法能达到最佳甚至超过论文中的结果
4.分析与后续
一.首先是前面提到的,在这里的复现并没有使用pixel padding的数据增强方法,却达到了接近甚至超过论文中结果的performance,难道是源于我们在恒等层使用了B方法而论文中使用了A方法吗?答案是yes,后续会有进一步分析验证。
二.网络结构中采用了batch normalization,这个层的作用是什么?从上述可以看出,msra初始化方法要由于其他两种,为什么?这些都会在后续给出分析
三.后面还将给出另一篇文章的解读(https://arxiv.org/abs/1603.05027),实验其中的pre-activation和bottleneck结构
四.由于caffe结构限制,即使采用了多GPU,最终也只实验到164层的网络,对于上千层的网络则实在是没办法跑起来,希望有成功复现的人能给一点建议,感激不尽!
最后:部分代码和网络结构以及Model已经分享在github上,https://github.com/fish145/ResNet-on-Cifar10
ResNet在cifar10上完美复现结果见这一篇:Deep Residual Network学习(二)
- Deep Residual Network学习(一)
- Deep Residual Network学习(二)
- Deep Residual Network实验复现
- Deep Residual Network 与 梯度消失
- Deep Residual Network 与 梯度消失
- [caffe]深度学习之MSRA图像分类模型Deep Residual Network(深度残差网络)解读
- 深度残差网络(Deep Residual Network )
- 【面向代码】学习 Deep Learning(一)Neural Network
- 【面向代码】学习 Deep Learning(一)Neural Network .
- 【面向代码】学习 Deep Learning(一)Neural Network
- 【面向代码】学习 Deep Learning(一)Neural Network
- 【面向代码】学习 Deep Learning(一)Neural Network
- 【面向代码】学习 Deep Learning(一)Neural Network
- 【面向代码】学习 Deep Learning(一)Neural Network
- 【面向代码】学习 Deep Learning(一)Neural Network
- 《Neural network and deep learning》学习笔记(一)
- 【面向代码】学习 Deep Learning(一)Neural Network
- 【面向代码】学习 Deep Learning(一)Neural Network
- 哈哈,我也开通了博客
- CodeForces 686B Little Robber Girl's Zoo
- QT对象模型和一个小细节
- C++ 引用的作用和用法
- poj 1159 Palindrome
- Deep Residual Network学习(一)
- 浅谈Java中的hashcode方法
- Mr_liu之第三方横向导航
- 记一次oracle imp导入时遇到字符集告警后修改字符集的过程
- 2050. 【8.18】游戏
- Android中Application
- C++ primer plus读书笔记(六)
- 【NOIP2016提高A组模拟8.17】(雅礼联考day1)总结
- SQL中in与exist的区别