指定培训选项自定义训练循环
对于大多数任务,您可以控制使用训练算法的细节trainingOptions
和trainNetwork
功能。如果trainingOptions
功能不提供所需的选项你的任务(例如,一个定制的学习速率的时间表),然后你可以定义自己的自定义训练循环使用dlnetwork
对象。一个dlnetwork
对象允许您指定训练一个网络层图使用自动分化。
指定的选项trainingOptions
使用这些示例作为指南:
培训选项 | trainingOptions 论点 |
例子 |
---|---|---|
亚当解算器 | 自适应估计时刻(亚当) | |
RMSProp解算器 | 均方根传播(RMSProp) | |
个解算器 | 随机梯度下降法与动量(个) | |
学习速率 | “InitialLearnRate” |
学习速率 |
学习产量表 | 分段学习产量表 | |
培训进展 | “阴谋” |
情节 |
详细输出 | 详细输出 | |
Mini-batch大小 | “MiniBatchSize” |
Mini-Batch大小 |
数量的时代 | “MaxEpochs” |
数量的时代 |
验证 | 验证 | |
l2正则化 | “L2Regularization” |
L2正规化 |
梯度剪裁 | 梯度剪裁 | |
单CPU或GPU培训 | “ExecutionEnvironment” |
单CPU或GPU培训 |
检查点 | “CheckpointPath” |
检查点 |
解算器选项
指定解算器,使用adamupdate
,rmspropupdate
,sgdmupdate
在你的训练循环功能更新步骤。实现自己的自定义解决,更新可学的参数使用dlupdate
函数。
自适应估计时刻(亚当)
用亚当,更新您的网络参数使用adamupdate
函数。指定渐变衰减和平方梯度衰减因素使用对应的输入参数。
均方根传播(RMSProp)
使用RMSProp更新你的网络参数,使用rmspropupdate
函数。指定分母抵消(ε)使用对应的输入参数的值。
随机梯度下降法与动量(个)
使用个更新你的网络参数,使用sgdmupdate
函数。使用相应的输入参数指定的势头。
学习速率
指定学习速率,使用输入参数的学习速率adamupdate
,rmspropupdate
,sgdmupdate
功能。
轻松地调整学习速率或用它来定义学习时间表,设置初始学习速率在定制培训循环。
learnRate = 0.01;
分段学习产量表
自动放弃学习速度训练中使用分段学习进度,学习速率乘以一个给定下降因素后指定时间间隔。
很容易地指定一个分段学习产量表,创建变量learnRate
,learnRateSchedule
,learnRateDropFactor
,learnRateDropPeriod
,在那里learnRate
最初的学习速率,learnRateSchedule
包含两“分段”
或“没有”
,learnRateDropFactor
是一个标量在[0,1],指定学习速率的因素下降,然后呢learnRateDropPeriod
是一个正整数,指定有多少下降学习速率之间的时代。
learnRate = 0.01;learnRateSchedule =“分段”learnRateDropPeriod = 10;learnRateDropFactor = 0.1;
内部培训循环,每个时代的结束时,下降时的学习速率learnRateSchedule
选择是“分段”
和当前时代数字的倍数learnRateDropPeriod
。设置新的学习速率的乘积学习速度和学习速率下降的因素。
如果learnRateSchedule = =“分段”& &国防部(时代,learnRateDropPeriod) = = 0 learnRate = learnRate * learnRateDropFactor;结束
情节
情节训练精度损失和在训练,计算mini-batch损失和准确性或均方误差(RMSE)模型损失函数,并把它们使用TrainingProgressMonitor
对象。
很容易地指定情节应该打开或关闭,设置可见
财产的TrainingProgressMonitor
对象。默认情况下,可见
被设置为真正的
。当可见
被设置为假
日志的软件培训指标和信息,但不显示培训进度窗口。您可以显示培训通过改变后的培训进度窗口可见
财产。情节也验证指标,使用相同的选项validationData
和validationFrequency
中描述的验证。
validationData = {XValidation, YValidation};validationFrequency = 50;
在培训之前,初始化一个TrainingProgressMonitor
对象。监视器自动跟踪对象的建设以来的运行时间。使用这个时间代表训练的时间,确保你创建TrainingProgressMonitor
对象接近的开始训练循环。
分类任务,创建一个情节来追踪损失和训练和验证数据的准确性。也跟踪时代数量和培训进度百分比。
监控= trainingProgressMonitor;班长。指标= [“TrainingAccuracy”,“ValidationAccuracy”,“TrainingLoss”,“ValidationLoss”];groupSubPlot(监控,“准确性”,(“TrainingAccuracy”,“ValidationAccuracy”]);groupSubPlot(监控,“损失”,(“TrainingLoss”,“ValidationLoss”]);班长。信息=“时代”;班长。包含=“迭代”;班长。进步= 0;
对于回归任务,调整代码通过改变变量名和标签,以便它初始化块的培训和验证RMSE而不是训练和验证精度。
在训练循环,迭代结束时,使用recordMetrics
和updateInfo
功能包括适当的指标和信息培训循环。对于分类任务,添加点对应于mini-batch mini-batch准确性和损失。如果当前迭代1或多个验证频率的选择,然后还添加点验证数据。
recordMetrics(监控、迭代…TrainingLoss = lossTrain,…TrainingAccuracy = accuracyTrain);updateInfo(监视、时代=字符串(时代)+“的”+字符串(numEpochs));如果迭代1 = = | |国防部(迭代,validationFrequency) = = 0 recordMetrics(监控、迭代…ValidationLoss = lossValidation,…ValidationAccuracy = accuracyValidation);结束班长。进步= 100 *迭代/ numIterations;
accuracyTrain
和lossTrain
对应于mini-batch精度损失函数和损失计算模型。对于回归任务,使用mini-batch RMSE损失而不是mini-batch精度。
你可以停止训练使用停止培训进度窗口按钮。当你点击停止,停止
监视更改的属性1
(真正的
)。培训如果你停止循环退出时停止
属性是1
。
而numEpochs < maxEpochs & & ~ monitor.Stop%的定制培训循环代码。结束
关于策划的更多信息和记录指标在训练,明白了在训练监控定制培训循环进展。
学习如何计算验证指标,明白了验证。
详细输出
显示培训损失和准确性在训练一个详细的表,计算mini-batch损失和准确性(分类任务)或RMSE(回归任务)在模型中损失函数和显示使用disp
函数。
很容易地指定详细的表应该打开或关闭,创建变量详细的
和verboseFrequency
,在那里详细的
是真正的
或假
和verbosefrequency
指定打印详细输出之间进行了多少次迭代。显示验证指标,使用相同的选项validationData
和validationFrequency
中描述的验证。
verbose = true verboseFrequency = 50;validationData = {XValidation, YValidation};validationFrequency = 50;
在培训之前,显示详细的输出表标题和初始化一个计时器使用抽搐
函数。
disp (“| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |”)disp (“| | |时代迭代时间| Mini-batch | |验证Mini-batch | |验证基地学习|”)disp (“| | | | (hh: mm: ss)精度精度| | | | |”损失损失)disp (“| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |”)开始=抽搐;
对于回归任务,调整代码使它显示的培训和验证RMSE而不是训练和验证的准确性。
在训练循环,一次迭代的末尾,打印时的详细输出详细的
选择是真正的
,这是第一次迭代或迭代数字的倍数verboseFrequency
。
如果详细的& &(迭代= = 1 | |国防部(迭代,verboseFrequency) = = 0 D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);如果isempty (validationData) | |国防部(迭代,validationFrequency) ~ = 0 accuracyValidation =”“;lossValidation =”“;结束disp (“|”+…垫(时代7“左”)+“|”+…垫(迭代,11日“左”)+“|”+…垫(D, 14日“左”)+“|”+…垫(accuracyTrain 12“左”)+“|”+…垫(accuracyValidation 12“左”)+“|”+…垫(lossTrain 12“左”)+“|”+…垫(lossValidation 12“左”)+“|”+…垫(learnRate 15“左”)+“|”)结束
对于回归任务,调整代码使它显示的培训和验证RMSE而不是训练和验证的准确性。
当训练完成后,打印的最后边界详细表。
disp (“| = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = |”)
学习如何计算验证指标,明白了验证。
Mini-Batch大小
设置mini-batch大小取决于数据或使用的数据存储类型的格式。
容易地指定mini-batch大小,创建一个变量miniBatchSize
。
miniBatchSize = 128;
在一个图像数据存储的数据,在训练之前,设置ReadSize
属性数据存储的mini-batch大小。
洛桑国际管理发展学院。ReadSize = miniBatchSize;
增强图像数据存储中的数据,在训练之前,设置MiniBatchSize
属性数据存储的mini-batch大小。
augimds。MiniBatchSize = MiniBatchSize;
对于内存中的数据,在每个迭代的开始,在培训阅读观察直接从数组中。
idx =((迭代- 1)* miniBatchSize + 1):(迭代* miniBatchSize);X = XTrain (:,:,:, idx);
数量的时代
为培训指定时代的最大数量的外循环训练循环。
方便地指定的最大数量时代,创建变量maxEpochs
包含时代的最大数量。
maxEpochs = 30;
外层循环的循环培训,指定循环范围1、2,…,maxEpochs
。
时代= 0;而numEpochs < maxEpochs时代=时代+ 1;…结束
验证
验证您的网络在训练,留出了验证集和评估网络性能数据。
很容易地指定验证选项,创建变量validationData
和validationFrequency
,在那里validationData
包含了验证数据或为空validationFrequency
指定验证网络之间进行了多少次迭代。
validationData = {XValidation, TValidation};validationFrequency = 50;
培训期间循环,更新网络参数,测试后的网络进行了验证设置使用预测
函数。验证网络只有当指定验证数据,它是第一个迭代或当前迭代的倍数validationFrequency
选择。
如果迭代1 = = | |国防部(迭代,validationFrequency) = = 0 YValidation =预测(网络,XValidation);lossValidation = crossentropy (YValidation TValidation);[~,idx] = max (YValidation);labelsPredValidation =一会(idx);accuracyValidation =意味着(labelsPredValidation = = labelsValidation);结束
TValidation
是一个炎热的编码的标签一会
。计算的准确性,转换TValidation
一个数组的标签。
对于回归任务,调整代码,以便计算验证RMSE而不是验证精度。
为一个例子,演示如何计算和情节验证指标在训练,明白了在训练监控定制培训循环进展。
早期停止
停止训练早期损失了验证时停止下降,用国旗来打破循环培训。
容易地指定验证耐心(的次数,验证损失之前可以大于或等于最小的损失在网络训练之前停止),创建一个变量validationPatience
。
validationPatience = 5;
在培训之前,初始化一个变量earlyStop
和validationLosses
,在那里earlyStop
是一个国旗停止训练早期和validationLosses
包含的损失比较。初始化早期停止标志假
和数组的验证与损失正
。
earlyStop = false;如果isfinite (validationPatience) validationLosses =正(1,validationPatience);结束
培训内部循环,在循环mini-batches,添加earlyStop
国旗的循环条件。
而hasdata (ds) & & ~ earlyStop…结束
在验证步骤,添加新的验证数组损失validationLosses
。如果数组的第一个元素是最小的,然后设置earlyStop
旗帜真正的
。否则,删除第一个元素。
如果isfinite (validationPatience) validationLosses = [validationLosses validationLoss);如果分钟(validationLosses) = = validationLosses earlyStop = true (1);其他的validationLosses (1) = [];结束结束
l2正则化
应用L2正规化的权重,使用dlupdate
函数。
很容易地指定L2正则化因子,创建变量l2Regularization
包含L2正则化因子。
l2Regularization = 0.0001;
在培训期间,损失计算模型和梯度后,对于每一个的重量参数,添加L的产物2正则化因子和权重计算梯度使用dlupdate
函数。只更新重量参数,提取的参数名称“重量”
。
idx = net.Learnables。参数= =“重量”;梯度(idx:) = dlupdate (@ (g, w) g + l2Regularization * w梯度(idx:), net.Learnables (idx:));
在添加L之后2正则化参数的梯度,更新网络参数。
梯度剪裁
剪辑渐变,使用dlupdate
函数。
容易地指定梯度剪切选项,创建变量gradientThresholdMethod
和gradientThreshold
,在那里gradientThresholdMethod
包含“global-l2norm”
,“l2norm”
,或“绝对值”
,gradientThreshold
是一个积极的标量包含阈值或正
。
gradientThresholdMethod =“global-l2norm”;gradientThreshold = 2;
创建函数命名thresholdGlobalL2Norm
,thresholdL2Norm
,thresholdAbsoluteValue
,应用“global-l2norm”
,“l2norm”
,“绝对值”
阈值方法,分别。
为“global-l2norm”
选项,功能作用于所有模型的梯度。
函数gradientThreshold梯度= thresholdGlobalL2Norm(梯度)globalL2Norm = 0;为i = 1:元素个数(梯度)globalL2Norm = globalL2Norm +总和(梯度{我}(:)。^ 2);结束globalL2Norm =√globalL2Norm);如果globalL2Norm > gradientThreshold normScale = gradientThreshold / globalL2Norm;为i = 1:元素个数(梯度)梯度{我}=梯度{我}* normScale;结束结束结束
为“l2norm”
和“绝对值”
独立选择,每个梯度上的功能操作。
函数梯度= thresholdL2Norm渐变gradientThreshold gradientNorm =√(总和(梯度(:)^ 2));如果gradientNorm > gradientThreshold梯度=梯度* (gradientThreshold / gradientNorm);结束结束
函数gradientThreshold梯度= thresholdAbsoluteValue(梯度)梯度(梯度> gradientThreshold) = gradientThreshold;梯度(梯度< -gradientThreshold) = -gradientThreshold;结束
在培训期间,损失计算模型和梯度后,应用适当的梯度渐变使用剪切方法dlupdate
函数。因为“global-l2norm”
选择要求所有梯度值,应用thresholdGlobalL2Norm
直接函数梯度。为“l2norm”
和“绝对值”
选择,更新梯度独立使用dlupdate
函数。
开关gradientThresholdMethod情况下“global-l2norm”梯度= thresholdGlobalL2Norm(梯度,gradientThreshold);情况下“l2norm”梯度= dlupdate (@ (g) thresholdL2Norm (g, gradientThreshold),渐变);情况下“绝对值”梯度= dlupdate (@ (g) thresholdAbsoluteValue (g, gradientThreshold),渐变);结束
应用梯度阈值操作后,更新网络参数。
单CPU或GPU培训
软件,默认情况下,只使用CPU执行计算。训练在一个GPU,转换数据gpuArray
对象。使用GPU需要并行计算工具箱™许可和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU计算的需求(并行计算工具箱)。
容易地指定执行环境,创建变量executionEnvironment
包含两“cpu”
,“图形”
,或“汽车”
。
executionEnvironment =“汽车”
培训期间,阅读mini-batch后,检查执行环境的选择和转换数据gpuArray
如果有必要的话)。的canUseGPU
函数检查可用的gpu。
如果(executionEnvironment = =“汽车”& & canUseGPU) | | executionEnvironment = =“图形”X = gpuArray (X);结束
检查点
拯救检查点网络在训练保存网络使用保存
函数。
方便地指定检查点是否应该打开,创建变量checkpointPath
检查点网络或包含的文件夹是空的。
checkpointPath = fullfile (tempdir,“检查点”);
如果检查点文件夹不存在,在训练之前,创建检查点文件夹。
如果~存在(checkpointPath“dir”mkdir (checkpointPath)结束
在培训期间,在一个时代的终结,在垫文件保存网络。指定一个文件名包含当前迭代数,日期和时间。
如果~ isempty (checkpointPath) D =字符串(datetime (“现在”格式=“yyyy_MM_dd__HH_mm_ss”));文件名=“net_checkpoint__”+迭代+“_”+ D +“.mat”;保存(文件名,“净”)结束
净
是dlnetwork
对象保存。
另请参阅
adamupdate
|rmspropupdate
|sgdmupdate
|dlupdate
|dlarray
|dlgradient
|dlfeval
|dlnetwork