深度学习模型训练全流程! - 云+社区- 腾讯云

文章推薦指數: 80 %
投票人數:10人

一个成熟合格的深度学习训练流程至少具备以下功能:在训练集上进行训练;在验证集上进行验证;模型可以保存最优的权重,并读取权重;记录下训练集和 ... 腾讯云备案控制台云+社区专栏视频精选问答沙龙云+竞赛团队主页开发者手册腾讯云TI平台TVP实验室搜索搜索关闭创作写文章发视频提问登录注册展开腾讯云·社区登录首页专栏视频精选问答沙龙云+竞赛团队主页开发者手册腾讯云TI平台TVP返回腾讯云官网Datawhale447篇文章深度学习模型训练全流程!转到我的清单专栏首页Datawhale专栏深度学习模型训练全流程!20分享分享文章到朋友圈分享文章到QQ分享文章到微博复制文章链接到剪贴板海报分享海报分享深度学习模型训练全流程!发布于2020-06-1611:08:56阅读2.6K0作者:黄星源、奉现,Datawhale优秀学习者本文从构建数据验证集、模型训练、模型加载和模型调参四个部分对深度学习中模型训练的全流程进行讲解。

一个成熟合格的深度学习训练流程至少具备以下功能:在训练集上进行训练;在验证集上进行验证;模型可以保存最优的权重,并读取权重;记录下训练集和验证集的精度,便于调参。

本文CNN模型构建参考:https://mp.weixin.qq.com/s/JhFun5I_8Kjkbz6S4613Xw数据及背景https://tianchi.aliyun.com/competition/entrance/531795/introduction(阿里天池-零基础入门CV赛事)构建验证集在机器学习模型(特别是深度学习模型)的训练过程中,模型是非常容易过拟合的。

深度学习模型在不断的训练过程中训练误差会逐渐降低,但测试误差的走势则不一定。

在模型的训练过程中,模型只能利用训练数据来进行训练,并不能接触到测试集上的样本,故需要构建验证数据集对模型进行验证。

过拟合与欠拟合拟合(Fitting):就是说这个曲线能不能很好的描述某些样本,并且有比较好的泛化能力。

过拟合(Overfitting):模型把数据学习的太彻底,以至于把噪声数据的特征也学习到了,这样就会导致在后期测试的时候不能够很好地识别数据,即不能正确的分类,模型泛化能力太差。

欠拟合(UnderFitting):模型没有很好地捕捉到数据特征,不能够很好地拟合数据,或者是模型过于简单无法拟合或区分样本。

防止过拟合方法正则化方法。

正则化方法包括L0正则、L1正则和L2正则,而正则一般是在目标函数之后加上对于的范数。

但是在机器学习中一般使用L2正则。

数据增强(Dataaugmentation),增大数据的训练量,还有一个原因就是我们用于训练的数据量太小导致的,训练数据占总数据的比例过小。

重新清洗数据,导致过拟合的一个原因也有可能是数据不纯导致的,如果出现了过拟合就需要我们重新清洗数据。

提前终止法(Earlystopping),对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降(Gradientdescent)学习算法。

提前终止法便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。

丢弃法(Dropout)。

这个方法在神经网络里面很常用。

丢弃法是ImageNet中提出的一种方法,通俗一点讲就是丢弃法在训练的时候让神经元以一定的概率不工作。

具体看下图:左侧为全连接网络,右侧的网络以0.5的概率丢弃神经元。

输出层并没有应用Dropout方法1:L1正则化在原始的代价函数后面加上一个L1正则化项,即全部权重的绝对值的和,再乘以(这里不像L2正则化项那样,须要再乘以1/2)。

先计算导数:上式中表示的符号,那么权重w的更新规则为: 比原始的更新规则多出了这一项。

当为正时,,则更新后的变小;当为负时,>0,则更新后的变大——因此它的效果就是让往0靠,使网络中的权重尽可能为0,也就相当于减小了网络复杂度,防止过拟合。

另外,上面没有提到一个问题,当为0时怎么办?当等于0时,是不可导的。

所以我们仅仅能依照原始的未经正则化的方法去更新,这就相当于去掉这一项,所以我们能够规定,这样就把的情况也统一进来了。

(编程时,令方法2:L2正则化(权重衰减) L2正则化就是在代价函数后面再加上一个正则化项:前一项代表原始的代价函数,后面那一项就是L2正则化项。

它是这样来的:全部参数的平方和,除以训练集的样本大小n。

λ就是正则项系数,权衡正则项与项的比重。

另外另一个系数1/2,1/2经常会看到,主要是为了后面求导的结果方便,后面那一项求导会产生一个2,与1/2相乘刚好凑整。

L2正则化项是怎么避免过拟合的呢?我们推导一下看看,先求导:能够发现L2正则化项对b的更新没有影响,可是对于w的更新有影响:在不使用L2正则化时。

求导结果中前系数为1,经变化后前面系数为,由于、、都是正的。

所以小于1,它的效果是减小,这也就是权重衰减(weightdecay)的由来。

当然考虑到后面的导数项,终于的值可能增大也可能减小。

另外,必须提一下,对于基于mini-batch的随机梯度下降,w和b更新的公式跟上面给出的有点不同:对照上面参数的更新公式。

能够发现后面那一项变了,变成全部导数加和,乘以再除以,是一个mini-batch中样本的个数。

在此我们仅仅是解释了L2正则化项有让“变小”的效果,可是还没解释为什么“变小”能够防过拟合?一个所谓“显而易见”的解释就是:更小的权值,从某种意义上说,表示网络的复杂度更低,对数据的拟合刚刚好(这个法则也叫做奥卡姆剃刀),而在实际应用中,也验证了这一点,L2正则化的效果往往好于未经正则化的效果。

当然,对于非常多人(包含我)来说,这个解释似乎不那么显而易见,所以这里加入一个略微数学一点的解释(引自知乎):过拟合的时候,拟合函数的系数往往非常大,为什么?过拟合,就是拟合函数须要顾忌每个点。

终于形成的拟合函数波动非常大。

在某些非常小的区间里,函数值的变化非常剧烈。

这就意味着函数在某些小区间里的导数值(绝对值)非常大,由于自变量值可大可小,所以仅仅有系数足够大,才干保证导数值非常大。

而L2正则化是通过约束參数的范数使其不要太大,所以能够在一定程度上降低过拟合情况。

方法3:数据增强(Dataaugmentation)在深度学习方法中,海量的训练数据,意味着能够用更深的网络,训练出更好的模型。

所以,能够在原始数据上做些改动,得到很多其它的数据,以图片数据集举例,能够做各种变换,如:将原始图片旋转一个小角度加入随机噪声一些有弹性的畸变(elasticdistortions),论文《Bestpracticesforconvolutionalneuralnetworksappliedtovisualdocumentanalysis》对MNIST做了各种变种扩增。

截取(crop)原始图片的一部分,比方DeepID中,从一副人脸图中,截取出了100个小patch作为训练数据,极大地添加了数据集。

方法4:提前终止法(Earlystopping)对模型进行训练的过程即是对模型的参数进行学习更新的过程,这个参数学习的过程往往会用到一些迭代方法,如梯度下降(Gradientdescent)学习算法。

提前终止法便是一种迭代次数截断的方法来防止过拟合的方法,即在模型对训练数据集迭代收敛之前停止迭代来防止过拟合。

提前终止法的具体做法是,在每一个Epoch结束时(一个Epoch集为对所有的训练数据的一轮遍历)计算验证集的正确率,当正确率不再提高时,就停止训练。

这种做法很符合直观感受,因为正确率都不再提高了,在继续训练也是无益的,只会提高训练的时间。

那么该做法的一个重点便是怎样才认为验证集正确率不再提高了呢?并不是说验证集正确率一降下来便认为不再提高了,因为可能经过这个Epoch后,正确率降低了,但是随后的Epoch又让正确率又上去了,所以不能根据一两次的连续降低就判断不再提高。

一般的做法是,在训练的过程中,记录到目前为止最好的验证集正确率,当连续10次Epoch(或者更多次)没达到最佳正确率时,则可以认为正确率不再提高了。

此时便可以停止迭代了(EarlyStopping)。

这种策略也称为“No-improvement-in-n”,n即Epoch的次数,可以根据实际情况取。

方法5:丢弃法(Dropout)L1、L2正则化是通过改动代价函数来实现的,而丢弃法则是通过改动神经网络本身来实现的,它是在训练网络时用的一种技巧(trike),它的流程例如以下:假设我们要训练上图这个网络,在训练开始时,我们随机地“删除”一部分的隐层单元,视它们为不存在。

保持输入输出层不变,如上图所示,依照BP算法更新上图神经网络中的权值(虚线连接的单元不更新,由于它们被“暂时删除”了)。

以上就是一次迭代的过程,在第二次迭代中,也用相同的方法,仅仅只是这次删除的那一部分隐层单元,跟上一次删除掉的肯定是不一样的。

我们每一次迭代都是“随机”地去删掉一部分,直至训练结束。

以上就是丢弃法t,它为什么有助于防止过拟合呢?能够简单地这样解释,运用了丢弃法的训练过程,相当于训练了非常多个仅仅有部分隐层单元的神经网络,每个这种半数网络,都能够给出一个分类结果,这些结果有的是正确的,有的是错误的。

随着训练的进行,大部分半数网络都能够给出正确的分类结果。

那么少数的错误分类结果就不会对终于结果造成大的影响。

删除神经单元,不工作,通常keep_prob取0.5,在编程时可以利用TensorFlow中DropoutWrappera函数。

在训练过程引入丢弃策略,其Dropout层保留节点比例(keep_prob),每批数据输入时神经网络中的每个单元会以1-keep_prob的概率不工作,防止过拟合。

lstmCell=tf.contrib.rnn.DropoutWrapper(cell=lstmCell,output_keep_prob=0.5)复制防止欠拟合方法添加其他特征项,有时候我们模型出现欠拟合的时候是因为特征项不够导致的,可以添加其他特征项来很好地解决。

例如,“组合”、“泛化”、“相关性”三类特征是特征添加的重要手段,无论在什么场景,都可以照葫芦画瓢,总会得到意想不到的效果。

除上面的特征之外,“上下文特征”、“平台特征”等等,都可以作为特征添加的首选项。

添加多项式特征,这个在机器学习算法里面用的很普遍,例如将线性模型通过添加二次项或者三次项使模型泛化能力更强。

例如上面的图片的例子。

减少正则化参数,正则化的目的是用来防止过拟合的,但是现在模型出现了欠拟合,则需要减少正则化参数。

数据集划分训练集(TrainSet):模型用于训练和调整模型参数。

验证集(ValidationSet):用来验证模型精度和调整模型超参数。

测试集(TestSet):验证模型的泛化能力。

因为训练集和验证集是分开的,所以模型在验证集上面的精度在一定程度上可以反映模型的泛化能力。

在划分验证集的时候,需要注意验证集的分布应该与测试集尽量保持一致,不然模型在验证集上的精度就失去了指导意义。

既然验证集这么重要,那么如何划分本地验证集呢。

在一些比赛中,赛题方会给定验证集;如果赛题方没有给定验证集,那么参赛选手就需要从训练集中拆分一部分得到验证集。

验证集的划分有如下几种方式:留出法(Hold-Out)直接将训练集划分成两部分,新的训练集和验证集。

这种划分方式的优点是最为直接简单;缺点是只得到了一份验证集,有可能导致模型在验证集上过拟合。

留出法应用场景是数据量比较大的情况。

交叉验证法(CrossValidation,CV)将训练集划分成K份,将其中的K-1份作为训练集,剩余的1份作为验证集,循环K训练。

这种划分方式是所有的训练集都是验证集,最终模型验证精度是K份平均得到。

这种方式的优点是验证集精度比较可靠,训练K次可以得到K个有多样性差异的模型;CV验证的缺点是需要训练K次,不适合数据量很大的情况。

自助采样法(BootStrap)通过有放回的采样方式得到新的训练集和验证集,每次的训练集和验证集都是有区别的。

这种划分方式一般适用于数据量较小的情况。

这些划分方法是从数据划分方式的角度来讲的,在现有的数据比赛中一般采用留出法和交叉验证法。

如果数据量比较大,留出法还是比较合适的。

当然任何的验证集划分得到的验证集都是要保证训练集-验证集-测试集的分布一致,所以如果不管划分何种的划分方式都是需要注意的。

(这里的分布一般指的是与标签相关的统计分布,如果标签是带有时序信息,则验证集和测试集的时间间隔应该保持一致。

)模型训练和验证训练神经网络的流程1.好好检查数据训练神经网络的第一步是完全不接触任何神经网络代码,而是从彻底检查数据开始。

此步骤至关重要。

花时间去检查数据是一件比较重要的工作。

因为数据中往往可能存在异常值,而且了解它们的分布可以有利于我们找到一个更好的模型。

2.评估框架并得到一个并不完美的baseline此阶段的提示和技巧:固定随机种子:始终使用固定的随机种子来确保两次运行代码时您将获得相同的结果。

简化:在此阶段,请务必关闭任何数据扩充功能。

数据扩充是我们稍后可能会采用的一种正则化策略,但是目前这只是引入一种错误的尝试。

验证损失:验证您的损失是否从正确的损失值开始。

设定一个好的初始化人类基线:监控除损失之外的指标,这些指标是人类可以解释和检查的(例如准确性)。

尽可能评估自己(人类)的准确性并与之进行比较。

可视化预测动态。

我喜欢在培训过程中可视化固定测试批次上的模型预测。

这些预测如何运动的“动力”将使您对培训的进行方式有非常好的直觉。

如果网络以某种方式过度摆动,可能会感觉网络“努力”以适应您的数据,这表明不稳定。

抖动量也很容易注意到非常低或非常高的学习率。

3.过度拟合找到一个好的模型的方法有两个阶段:首先获得一个足够大的模型以使其可以过度拟合(即专注于训练损失),然后适当地对其进行正则化(放弃一些训练损失以提高验证损失)。

此阶段的一些提示和技巧:选择模型:为了减少训练损失,您需要为数据选择合适的体系结构。

Adam是安全的。

在设定基准的早期阶段,我喜欢以3e-4的学习率使用Adam。

以我的经验,亚当更宽容超参数,包括不良的学习速度。

对于ConvNets,调整良好的SGD几乎总是比Adam稍胜一筹,但是最佳学习率区域要狭窄得多且针对特定问题。

一次只使一个复杂化。

如果您有多个信号要插入您的分类器,我建议您将它们一个接一个地插入,并每次确保获得预期的性能提升。

不要相信学习率衰减的默认值。

如果您要重新使用其他领域的代码,请务必小心学习率。

4.正则化此阶段的一些提示和技巧:获取更多数据数据扩充创意增强:如果半假数据没有做到这一点,伪造数据也可能会有所作为。

人们正在寻找扩展数据集的创新方法。

例如,领域随机化,模拟的使用,巧妙的混合,例如将(潜在模拟的)数据插入场景,甚至GAN。

使用预训练网络坚持监督学习减小输入维数减小模型尺寸减小批量大小Dropout提早停止训练。

根据您测得的验证损失提前停止训练,以在模型快要过拟合的时候捕获模型。

尝试更大的模型。

大型模型大多数最终会过拟合,但是它们的“早期停止”性能通常会比小型模型好得多。

5.微调此阶段的一些提示和技巧:随机网格搜索超参数优化6.进一步提高精确率模型集成本节目标是使用Pytorch来完成CNN(卷积神经网络)的训练和验证过程,CNN网络结构。

需要完成的逻辑结构如下: 构造训练集和验证集;每轮进行训练和验证,并根据最优验证集精度保存模型。

#将自定义的Dataset封装成一个BatchSize大小的Tensor,用于后面的训练。

#训练集封装批量处理数据 train_loader=torch.utils.data.DataLoader( train_dataset,#数据加载 batch_size=10,#批处理大小设置 shuffle=True,#是否进项洗牌操作 num_workers=10,#是否进行多进程加载数据设置 ) #验证集封装 val_loader=torch.utils.data.DataLoader( val_dataset, batch_size=10, shuffle=False, num_workers=10, ) model=SVHN_Model1() criterion=nn.CrossEntropyLoss(size_average=False)#计算交叉熵(交叉熵损失函数 optimizer=torch.optim.Adam(model.parameters())#Adam优化算法 best_loss=1000.0 forepochinrange(20): train(train_loader,model,criterion,optimizer,epoch) val_loss=validate(val_loader,model,criterion) #保存验证集精度 ifval_loss>>your_data=#plugyourawesomedatasethere >>>model=SuperCrossValidator(SuperDuper.fit,your_data,ResNet50,SGDOptimizer) #conquerworldhere复制比如说,以上代码给人一种假象,即只通过一行代码就可以完成对神经网络的训练。

但事实上神经网络的训练是一件很复杂的事情。

如果您坚持使用该技术而不了解其工作原理,则很可能会失败。

2.神经网络的训练不知道怎么的就失败了当你错误配置代码时,通常会遇到某种异常:插入了一个整数,该整数应为字符串;该函数仅需要3个参数;导入失败;该密钥不存在;两个列表中的元素数量不相等。

此外,通常可以为某些功能创建单元测试。

这只是训练神经网络的开始。

可能在语法上,所有内容都是正确的,但还是会训练失败,而且也很难看出来到底哪里错了。

例如,也许在数据增强过程中左右翻转图像时忘记了翻转标签。

网络仍然可以工作良好,因为网络可以在内部学习检测翻转的图像,然后左右翻转预测;也许由于一个错误,自回归模型意外地将它试图预测的东西作为输入;或者,尝试修剪渐变,但修剪了损失,导致在训练过程中忽略了异常示例;或者,从预先训练的检查点初始化了权重,但未使用原始均值;或者,只是搞砸了正则化强度,学习率,其衰减率,模型大小等设置。

在大多数情况下,它会训练,但默默地工作会更糟。

训练神经网络的快速而暴力的方法行不通,这往往会令人感到难受。

事实上,使得神经网络正常工作本身就是一件比较困难的事情,可以通过缜密的思考,提高警惕,利用可视化帮助我们训练神经网络。

文章分享自微信公众号:Datawhale复制公众号名称本文参与腾讯云自媒体分享计划,欢迎热爱写作的你一起参与!如有侵权,请联系[email protected]删除。

展开阅读全文举报点赞2分享登录后参与评论0条评论机器学习模型训练全流程!周末在家无聊闲逛github,发现一个很有趣的开源项目,作者用手绘图的方式讲解了机器学习模型构建的全流程,逻辑清晰、生动形象。

同时,作者也对几张图进行了详细的讲...Datawhale慎用预训练深度学习模型似乎使用这些预训练模型已经成为行业最佳实践的新标准。

合情合理,为什么不利用一个经过大量数据和计算训练的模型呢?AiTechYunPytorch深度学习实战教程(三):UNet模型训练,深度解析!PS:文中出现的所有代码,均可在我的github上下载,欢迎Follow、Star:点击查看Jack_CuiPyTorch深度学习模型训练加速指南2021简要介绍在PyTorch中加速深度学习模型训练的一些最小改动、影响最大的方法。

我既喜欢效率又喜欢ML,所以我想我也可以把它写下来。

AI算法与图像处理图深度学习入门教程(四)——训练模型的原理深度学习还没学完,怎么图深度学习又来了?别怕,这里有份系统教程,可以将0基础的你直接送到图深度学习。

还会定期更新哦。

代码医生工作室初创公司如何训练大型深度学习模型OpenAI的GPT-3是一个令人印象深刻的深度学习模型,但是它有1750亿个参数,相当占用资源。

尽管有不同的估计,但是这种规模的模型在一个GPU...深度学习与Python深度学习笔记3-模型训练及模型评估指标「学习内容总结自udacity和coursera的深度学习课程,截图来自udacity课件」caoqi95深度学习的训练今天来聊聊深度学习的训练方法和注意事项 数据集的拆分: 首先要准备好已经处理好的数据集(注意数据集要满足独立同分布),分为训练集、验证集、测试集。

可按80%,1...linxinzhe深度学习的安全量化训练我们利用该设置中常用的量化方法实现了安全多方计算(MPC)神经网络的训练。

据我们所知,我们是第一个提出纯在MPC中训练的MNIST分类器,其准确率低于通过计算训...用户8789655深度学习的安全量化训练我们利用该设置中常用的量化方法实现了安全多方计算(MPC)神经网络的训练。

据我们所知,我们是第一个提出纯在MPC中训练的MNIST分类器,其准确率低于通过计算训...用户8789655请谨慎使用预训练的深度学习模型看起来使用这些预训练的模型已经成为行业最佳实践的新标准。

毕竟,有一个经过大量数据和计算训练的模型,你为什么不利用呢?AI算法与图像处理第一次深度学习模型是如何训练的计算机视觉学着学着,就自然而然的歪到机器学习,深度学习这一块儿了,因为单纯的图片处理是不能满足一些要求的,没学深度学习时,有时觉的它简单,因为不就按着套路来嘛。

...小白学视觉使用Java部署训练好的Keras深度学习模型Keras库为深度学习提供了一个相对简单的接口,使神经网络可以被大众使用。

然而,我们面临的挑战之一是将Keras的探索模型转化为产品模型。

Keras是用Pyth...AiTechYun用Java训练深度学习模型,原来这么简单!HelloGitHub推出的《讲解开源项目》系列。

这一期是由亚马逊工程师:KeerthanVasist(https://github.com/keerth...HelloGitHub深度学习-加快训练速度SGD是batch=1的情况下的训练示例[1240]SGD是batch=X的情况下的训练示例freesan44OpenCV+深度学习预训练模型,简单搞定图像识别|教程李林编译自pyimagesearch 作者AdrianRosebrock 量子位报道|公众号QbitAI ? OpenCV是一个2000年发布的...量子位更多文章Datawhale关注专栏文章447阅读量268.1K获赞1.1K作者排名485腾讯云原生专题云原生技术干货,业务实践落地。

视频公开课上线啦Vite学习指南,基于腾讯云Webify部署项目立即查看腾讯云自媒体分享计划入驻云加社区,共享百万资源包。

立即入驻广告关闭目录数据及背景构建验证集模型训练和验证模型调参写到最后社区专栏文章阅读清单互动问答技术沙龙技术快讯团队主页开发者手册腾讯云TI平台活动原创分享计划自媒体分享计划邀请作者入驻自荐上首页在线直播生态合作计划资源技术周刊社区标签开发者实验室关于视频介绍社区规范免责声明联系我们友情链接归档问题归档专栏文章归档快讯文章归档关键词归档开发者手册归档开发者手册Section归档云+社区扫码关注云+社区领取腾讯云代金券热门产品域名注册云服务器区块链服务消息队列网络加速云数据库域名解析云存储视频直播热门推荐人脸识别腾讯会议企业云CDN加速视频通话图像分析MySQL数据库SSL证书语音识别更多推荐数据安全负载均衡短信文字识别云点播商标注册小程序开发网站监控数据迁移Copyright©2013-2022TencentCloud.AllRightsReserved.腾讯云版权所有京公网安备11010802017518粤B2-20090059-1扫描二维码扫码关注云+社区领取腾讯云代金券



請為這篇文章評分?