深度学习_调参经验

面对一个图像分类问题,可以有以下步骤:

1.建立一个简单的CNN模型,一方面能够快速地run一个模型,以了解这个任务的难度

卷积层1:卷积核大小3*3,卷积核移动步长1,卷积核个数64,池化大小2*2,池化步长2,池化类型为最大池化,激活函数ReLU。

卷积层2:卷积核大小3*3,卷积核移动步长1,卷积核个数128,池化大小2*2,池化步长2,池化类型为最大池化,激活函数ReLU。

卷积层3:卷积核大小3*3,卷积核移动步长1,卷积核个数256,池化大小2*2,池化步长2,池化类型为最大池化,激活函数ReLU。

全连接层:隐藏层单元数1024,激活函数ReLU。

分类层:隐藏层单元数10,激活函数softmax。

参数初始化,所有权重矩阵使用random_normal(0.0, 0.001),所有偏置向量使用constant(0.0)。使用cross entropy作为目标函数,使用Adam梯度下降法进行参数更新,学习率设为固定值0.001。

该网络是一个有三层卷积层的神经网络,能够快速地完成图像地特征提取。全连接层用于将图像特征整合成分类特征,分类层用于分类。cross entropy也是最常用的目标函数之一,分类任务使用cross entropy作为目标函数非常适合。Adam梯度下降法也是现在非常流行的梯度下降法的改进方法之一,学习率过大会导致模型难以找到较优解,设置过小则会降低模型训练效率,因此选择适中的0.001。这样,我们最基础版本的CNN模型就已经搭建好了,接下来进行训练和测试以观察结果。

训练5000轮,观察到loss变化曲线、训练集准确率变化曲线和验证集准确率变化曲线如下图。测试集准确率为69.36%

2.使用数据增强技术(data augmentation),主要是在训练数据上增加微小的扰动或者变化,一方面可以增加训练数据,从而提升模型的泛化能力,另一方面可以增加噪声数据,从而增强模型的鲁棒性。主要的数据增强方法有:翻转变换 flip、随机修剪(random crop)、色彩抖动(color jittering)、平移变换(shift)、尺度变换(scale)、对比度变换(contrast)、噪声扰动(noise)、旋转变换/反射变换 (rotation/reflection)等,可以参考Keras的官方文档 [2] 。获取一个batch的训练数据,进行数据增强步骤之后再送入网络进行训练。

我主要做的数据增强操作有如下方面:

图像切割:生成比图像尺寸小一些的矩形框,对图像进行随机的切割,最终以矩形框内的图像作为训练数据。

图像翻转:对图像进行左右翻转。

图像白化:对图像进行白化操作,即将图像本身归一化成Gaussian(0,1)分布。

结果分析:我们观察训练曲线和验证曲线,很明显地发现图像白化的效果好,其次是图像切割,再次是图像翻转,而如果同时使用这三种数据增强技术,不仅能使训练过程的loss更稳定,而且能使验证集的准确率提升至82%左右,提升效果十分明显。而对于测试集,准确率也提升至80.42%。说明图像增强确实通过增加训练集数据量达到了提升模型泛化能力以及鲁棒性的效果,从准确率上看也带来了将近10%左右的提升,因此,数据增强确实有很大的作用。但是对于80%左右的识别准确率我们还是不够满意,接下来继续调参。

3.从模型入手,使用一些改进方法

接下来的步骤是从模型角度进行一些改进,这方面的改进是诞生论文的重要区域,由于某一个特定问题对某一个模型的改进千变万化,没有办法全部去尝试,因此一般会实验一些general的方法,比如批正则化(batch normalization)、权重衰减(weight decay)。我这里实验了4种改进方法,接下来依次介绍。

权重衰减(weight decay):对于目标函数加入正则化项,限制权重参数的个数,这是一种防止过拟合的方法,这个方法其实就是机器学习中的l2正则化方法,只不过在神经网络中旧瓶装新酒改名为weight decay [3]。

dropout:在每次训练的时候,让某些的特征检测器停过工作,即让神经元以一定的概率不被激活,这样可以防止过拟合,提高泛化能力 [4]。

批正则化(batch normalization):batch normalization对神经网络的每一层的输入数据都进行正则化处理,这样有利于让数据的分布更加均匀,不会出现所有数据都会导致神经元的激活,或者所有数据都不会导致神经元的激活,这是一种数据标准化方法,能够提升模型的拟合能力 [5]。

LRN:LRN层模仿生物神经系统的侧抑制机制,对局部神经元的活动创建竞争机制,使得响应比较大的值相对更大,提高模型泛化能力。

结果分析:我们观察训练曲线和验证曲线,随着每一个模型提升的方法,都会使训练集误差和验证集准确率有所提升,其中,批正则化技术和dropout技术带来的提升非常明显,而如果同时使用这些模型提升技术,会使验证集的准确率从82%左右提升至88%左右,提升效果十分明显。而对于测试集,准确率也提升至85.72%。我们再注意看左图,使用batch normalization之后,loss曲线不再像之前会出现先下降后上升的情况,而是一直下降,这说明batch normalization技术可以加强模型训练的稳定性,并且能够很大程度地提升模型泛化能力。所以,如果能提出一种模型改进技术并且从原理上解释同时也使其适用于各种模型,那么就是非常好的创新点,也是我想挑战的方向。现在测试集准确率提升至85%左右,接下来我们从其他的角度进行调参。

4.变化的学习率,进一步提升模型性能

在很多关于神经网络的论文中,都采用了变化学习率的技术来提升模型性能,大致的想法是这样的:

首先使用较大的学习率进行训练,观察目标函数值和验证集准确率的收敛曲线。

如果目标函数值下降速度和验证集准确率上升速度出现减缓时,减小学习率。

循环步骤2,直到减小学习率也不会影响目标函数下降或验证集准确率上升为止。

为了进行对比实验,实验1只使用0.01的学习率训练,实验2前10000个batch使用0.01的学习率,10000个batch之后学习率降到0.001,实验3前10000个batch使用0.01的学习率,10000~20000个batch使用0.001的学习率,20000个batch之后学习率降到0.0005。同样都训练5000轮,观察到loss变化曲线、训练集准确率变化曲线和验证集准确率变化曲线对比如下图。

结果分析:我们观察到,当10000个batch时,学习率从0.01降到0.001时,目标函数值有明显的下降,验证集准确率有明显的提升,而当20000个batch时,学习率从0.001降到0.0005时,目标函数值没有明显的下降,但是验证集准确率有一定的提升,而对于测试集,准确率也提升至86.24%。这说明,学习率的变化确实能够提升模型的拟合能力,从而提升准确率。学习率在什么时候进行衰减、率减多少也需要进行多次尝试。一般在模型基本成型之后,使用这种变化的学习率的方法,以获取一定的改进,精益求精。

5.加深网络层数,会发生什么事情?

现在深度学习大热,所以,在计算资源足够的情况下,想要获得模型性能的提升,大家最常见打的想法就是增加网络的深度,让深度神经网络来解决问题,但是简单的网络堆叠不一定就能达到很好地效果,抱着深度学习的想法,我按照plain-cnn模型 [6],我做了接下来的实验。

卷积层1:卷积核大小3*3,卷积核移动步长1,卷积核个数16,激活函数ReLU,使用batch_normal和weight_decay,接下来的n层,卷积核大小3*3,卷积核移动步长1,卷积核个数16,激活函数ReLU,使用batch_normal和weight_decay。

卷积层2:卷积核大小3*3,卷积核移动步长2,卷积核个数32,激活函数ReLU,使用batch_normal和weight_decay,接下来的n层,卷积核大小3*3,卷积核移动步长1,卷积核个数32,激活函数ReLU,使用batch_normal和weight_decay。

卷积层3:卷积核大小3*3,卷积核移动步长2,卷积核个数64,激活函数ReLU,使用batch_normal和weight_decay,接下来的n层,卷积核大小3*3,卷积核移动步长1,卷积核个数64,激活函数ReLU,使用batch_normal和weight_decay。

池化层:使用全局池化,对64个隐藏单元分别进行全局池化。

全连接层:隐藏层单元数10,激活函数softmax,使用batch_normal和weight_decay。

为了进行对比实验,进行4组实验,每组的网络层数分别设置8,14,20和32。同样都训练5000轮,观察到loss变化曲线、训练集准确率变化曲线和验证集准确率变化曲线对比如下图。

结果分析:我们惊讶的发现,加深了网络层数之后,性能反而下降了,达不到原来的验证集准确率,网络层数从8层增加到14层,准确率有所上升,但从14层增加到20层再增加到32层,准确率不升反降,这说明如果网络层数过大,由于梯度衰减的原因,导致网络性能下降,因此,需要使用其他方法解决梯度衰减问题,使得深度神经网络能够正常work。

6.终极武器,残差网络

2015年,Microsoft用残差网络 [7] 拿下了当年的ImageNet,这个残差网络就很好地解决了梯度衰减的问题,使得深度神经网络能够正常work。由于网络层数加深,误差反传的过程中会使梯度不断地衰减,而通过跨层的直连边,可以使误差在反传的过程中减少衰减,使得深层次的网络可以成功训练,具体的过程可以参见其论文[7]。

通过设置对比实验,观察残差网络的性能,进行4组实验,每组的网络层数分别设置20,32,44和56。观察到loss变化曲线和验证集准确率变化曲线对比如下图。

结果分析:我们观察到,网络从20层增加到56层,训练loss在稳步降低,验证集准确率在稳步提升,并且当网络层数是56层时能够在验证集上达到91.55%的准确率。这说明,使用了残差网络的技术,可以解决梯度衰减问题,发挥深层网络的特征提取能力,使模型获得很强的拟合能力和泛化能力。当我们训练深度网络的时候,残差网络很有可能作为终极武器发挥至关重要的作用。

作者:骄傲的少年233
链接:https://www.jianshu.com/p/96acc5e5deb1
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

原文地址:https://www.cnblogs.com/mfryf/p/11393653.html

时间: 2024-11-10 16:22:40

深度学习_调参经验的相关文章

深度学习网络调参技巧

转自https://zhuanlan.zhihu.com/p/24720954?utm_source=zhihu&utm_medium=social 之前曾经写过一篇文章,讲了一些深度学习训练的技巧,其中包含了部分调参心得:深度学习训练心得.不过由于一般深度学习实验,相比普通机器学习任务,时间较长,因此调参技巧就显得尤为重要.同时个人实践中,又有一些新的调参心得,因此这里单独写一篇文章,谈一下自己对深度学习调参的理解,大家如果有其他技巧,也欢迎多多交流. 好的实验环境是成功的一半 由于深度学习实

深度学习-网络调参技巧

最近在做深度学习实验,跑一次实验轻则以小时计.重则以天计,实在没有那么多的时间可以等待,因此想想用尽可能少的实验次数,得到尽可能好的实验效果.这样的话,问题就可以归结为如何设计合适的网络结构.如何设计合适的训练策略,主要就是: 层数.每一层卷积核个数.卷积权重初始化方式.dropout ratio.BN.全连接层神经元个数.Relu等网络结构参数应该如何选? 学习率.decay等solver参数又该如何设置? 在参考炼丹实验室的基础上,并结合自己的体会,谈谈对调参的理解,大家如果有其他技巧,也欢

深度学习调参经验汇总

此篇文章是在原创教程这个栏目下,但实际上是一篇汇总整理文章.相信大家在做深度学习时对调参尤为无奈,经验不足乱调一通,或者参数太多无从下手,我也如此.希望通过此文汇总网上一些调参的经验方法,供大家参考.此文会对网上每一篇调参文章做简练的总结与提炼,以此为此文的组成单元,并附上原文的链接.如果遇到不对的地方,欢迎指正~本文也将不定期更新,最后祝大家调参(炼金)顺利! 有多少人工,就有多少智能!(笑哭脸) 人工智障 炼金大法 你已经是成熟的算法了,要学会自己调参 正文开始 UNIT 1 case1:网

机器学习_深度学习_入门经典(永久免费报名学习)

机器学习_深度学习_入门经典(博主永久免费教学视频系列) https://study.163.com/course/courseMain.htm?courseId=1006390023&share=2&shareId=400000000398149 作者座右铭---- 与其被人工智能代替,不如主动设计机器为我们服务. 长期以来机器学习很多教材描述晦涩难懂,大量专业术语和数学公式让学生望而止步.生活中机器学习就在我们身边,谷歌,百度,Facebook,今日头条都运用大量机器学习算法,实现智能

从下往上看--新皮层资料的读后感 第五部分 从perceptron 感知机学习自动调参开始

从上节已经知道perceptron 不是什么智能算法,在它的基础上我们需要去解决调参的问题.既然是调节参数,总要有个目标和手段吧,看看这些大神怎么搞的.首先建立目标,对于生活里面常常会面对分类的问题,比如:在人群中把流氓分子找出来,我们已经有3000个强奸犯和7000个普通的人的档案记录. 大家希望找到一个办法,给出新的档案,按照这个档案的情况识别第10001个人是不是是不是流氓.好吧,这很不道德,流氓好像也显得太多,但我们姑且这么干吧.首先我们先用人的模式干一次这个事情.先把应用题要求梳理一下

GBDT调参经验

在梯度提升树(GBDT)原理小结中,我们对GBDT的原理做了总结,本文我们就从scikit-learn里GBDT的类库使用方法作一个总结,主要会关注调参中的一些要点. 1. scikit-learn GBDT类库概述 在sacikit-learn中,GradientBoostingClassifier为GBDT的分类类, 而GradientBoostingRegressor为GBDT的回归类.两者的参数类型完全相同,当然有些参数比如损失函数loss的可选择项并不相同.这些参数中,类似于Adabo

神经网络调参经验

对比Mean 和 Max 如果某些动作路径(从神经网络的策略输出中采样)比平均动作路径好得多,那么通过调整策略就有增加奖励的空间.相反,当这个差距缩小时,模型就收敛了; 原文地址:https://www.cnblogs.com/twodoge/p/12080024.html

深度学习相关资料(1)

一.学习清单 1.综合类 (1)收集了各种最新最经典的文献,神经网络的资源列表:https://github.com/robertsdionne/neural-network-papers  里面包含了深度学习领域经典.以及最新最牛逼的算法,如果把这个列表学过一遍,基本已然达到了大神级别. (2)机器学习学习清单:https://github.com/ujjwalkarn/Machine-Learning-Tutorials/blob/master/README.md  当然也包含了深度学习各种

深度学习一(相关资料)

原文地址:http://blog.csdn.net/hjimce/article/details/45421595 作者:hjimce 一.学习清单 1.综合类 (1)收集了各种最新最经典的文献,神经网络的资源列表:https://github.com/robertsdionne/neural-network-papers  里面包含了深度学习领域经典.以及最新最牛逼的算法,如果把这个列表学过一遍,基本已然达到了大神级别. (2)机器学习学习清单:https://github.com/ujjwa