对于大多数任务,您可以控制使用训练算法细节trainingOptions
和trainNetwork
功能。如果trainingOptions
功能不提供您需要为您的任务选项(例如,定制的学习费率表),那么你可以使用自动微分定义自己的训练循环。
要指定相同的选项trainingOptions
中,使用这些实施例作为指导:
训练选项 | trainingOptions 论点 |
例 |
---|---|---|
亚当求解 | 自适应矩估计(ADAM) | |
RMSProp求解 | 均方根传播(RMSProp) | |
SGDM求解 | 随动量随机梯度下降(SGDM) | |
学习率 | 'InitialLearnRate' |
学习率 |
学习产量表 | 分段学习税率表 | |
训练进度 | “情节” |
地块 |
详细输出 | 详细输出 | |
Mini-batch大小 | 'MiniBatchSize' |
小批量大小 |
时代的数 | 'MaxEpochs' |
历元数 |
验证 | 验证 | |
大号2正则化 | 'L2Regularization' |
L2正则化 |
梯度剪裁 | 梯度剪裁 | |
单CPU或GPU训练 | “执行环境” |
单CPU或GPU训练 |
检查点 | 'CheckpointPath' |
检查点 |
要指定解算器,使用adamupdate
,rmspropupdate
和sgdmupdate
功能在你的训练循环的更新步骤。为了实现自己的自定义解算器,更新使用该参数可学习dlupdate
函数。
要使用亚当更新网络参数,使用adamupdate
函数。指定梯度衰变并使用相应的输入参数的平方梯度衰减的因素。
要使用RMSProp更新网络参数,使用rmspropupdate
函数。使用相应的输入参数指定分母偏移量(epsilon)值。
要使用SGDM更新网络参数,使用sgdmupdate
函数。使用相应的输入参数指定的势头。
要指定学习率,使用学习的速度输入参数adamupdate
,rmspropupdate
和sgdmupdate
功能。
要轻松地调整学习速率或将其用于自定义学习速率计划,请在自定义训练循环之前设置初始学习速率。
learnRate = 0.01;
自动挂断使用分段学习税率表在训练期间学习率,乘以该指定的时间间隔后,学会给定的下降因素率。
容易地指定分段学习税率表,创建变量learnRate
,learnRateSchedule
,learnRateDropFactor
和learnRateDropPeriod
,其中learnRate
是初始学习率,learnRateScedule
无论是含有“分段”
要么“没有”
,learnRateDropFactor
在该范围内的标[0,1]指定因子用于丢弃学习速率,和learnRateDropPeriod
是一个正整数,指定在降低学习速率之间间隔多少个epoch。
learnRate = 0.01;learnRateSchedule =“分段”learnRateDropPeriod = 10;learnRateDropFactor = 0.1;
里面的训练循环,在每一个时代的结束,掉落率学习时learnRateSchedule
选项“分段”
和当前历元数目是的倍数learnRateDropPeriod
。设置新的学习速度的学习速度和学习率下降因素的产物。
如果learnRateSchedule ==“分段”&& MOD(历元,learnRateDropPeriod)== 0 learnRate = learnRate * learnRateDropFactor;结束
要绘制在训练期间的训练损失和精度,计算出小批量损失,要么的准确性或在模型梯度起作用,并使用动画线图他们的根均方误差(RMSE)。
为了方便地指定的情节应该是打开或关闭,创建变量地块
包含其中任一“训练进度”
要么“没有”
。为了还积验证指标,使用相同的选项validationData
和validationFrequency
中描述的验证。
地块=“训练进度”;validationData = {XValidation,YValidation};validationFrequency = 50;
训练前,初始化使用动画线animatedline
函数。对于分类任务创造训练精度和培训损失的情节。被指定的验证数据时也初始化动画进行验证度量的行。
如果地块==“训练进度”图副区(2,1,1)lineAccuracyTrain = animatedline;ylabel(“准确性”)副区(2,1,2)lineLossTrain = animatedline;xlabel(“迭代”)ylabel(“失利”)如果〜的isEmpty(validationData)副区(1,2,1)lineAccuracyValidation = animatedline;副区(1,2,2)lineLossValidation = animatedline;结束结束
对于回归任务,调整通过改变变量名称和标签,以便它初始化为训练和验证,而不是RMSE的训练和验证准确性地块的代码。
在训练循环中,在迭代结束时,更新情节,使其包含适当的网络度量。对于分类任务,添加对应于微批精度和微批损失的点。如果验证数据是非空的,并且当前迭代是验证频率选项的1或多个,那么还要为验证数据添加点。
如果地块==“训练进度”addpoints(lineAccuracyTrain,迭代,accuracyTrain)addpoints(lineLossTrain,迭代,lossTrain)如果〜的isEmpty(validationData)&&(迭代== 1 || MOD(迭代,validationFrequency)== 0)addpoints(lineAccuracyValidation,迭代,accuracyValidation)addpoints(lineLossValidation,迭代,lossValidation)结束结束
accuracyTrain
和lossTrain
对应于在模型中梯度函数来计算该小批量的准确性和损失。对于回归任务,使用小批量RMSE的损失,而不是小批量的精度。
该addpoints
功能需要的数据点为具有类型双
。为了从数字数据dlarray
对象,请使用ExtractData由
函数。从GPU收集数据,使用收集
函数。
要了解如何计算验证指标,请参阅验证。
要显示在一个详细表训练在训练损失和精度,计算模型中的梯度起作用的小批量损失,要么精度(对于分类任务)或RMSE(对于回归任务),并使用显示它们DISP
函数。
要轻松指定了详细的表应该是打开或关闭,创建变量详细
和verboseFrequency
,其中详细
是真正
要么假
和verbosefrequency
指定详细的输出打印之间多少次迭代。要显示的验证指标,使用相同的选项validationData
和validationFrequency
中描述的验证。
冗长=真verboseFrequency = 50;validationData = {XValidation,YValidation};validationFrequency = 50;
训练前,显示详细的输出表格标题,并使用初始化定时器抽搐
函数。
disp (“| ====================================================================================================================== |”)DISP(“|大纪元|迭代|时间已|小批量|验证|小批量|验证|基地学习|”)DISP("| | | (hh:mm:ss) |精度|精度|损失|损失|率|")DISP(“| ====================================================================================================================== |”)开始=抽动;
对于回归任务,调整代码,以便它显示了训练和验证RMSE,而不是训练和验证准确性。
里面的训练循环,在迭代结束时,打印详细输出时详细
选项真正
并且它是第一迭代或迭代次数是的倍数verboseFrequency
。
如果冗长&&(迭代== 1 || MOD(迭代,verboseFrequency)== 0 d =持续时间(0,0,TOC(开始),'格式','HH:MM:SS');如果的isEmpty(validationData)||MOD(迭代,validationFrequency)〜= 0 accuracyValidation =“”;lossValidation =“”;结束disp (“|”+...垫(历元,7,'剩下')+“|”+...垫(迭代中,如图11所示,'剩下')+“|”+...垫(d,14,'剩下')+“|”+...垫(accuracyTrain,12,'剩下')+“|”+...垫(accuracyValidation,12,'剩下')+“|”+...垫(lossTrain,12,'剩下')+“|”+...垫(lossValidation,12,'剩下')+“|”+...垫(learnRate,15个,'剩下')+“|”)结束
对于回归任务,调整代码,以便它显示了训练和验证RMSE,而不是训练和验证准确性。
当训练完成时,打印verbose表的最后一个边框。
disp (“| ====================================================================================================================== |”)
要了解如何计算验证指标,请参阅验证。
设置小批量大小取决于数据存储区使用的数据或类型的格式。
要容易地指定小批量大小,创建一个变量miniBatchSize
。
miniBatchSize = 128;
对于在图像数据存储数据,在训练前,设置READSIZE
数据存储到小批量的特性。
imds.ReadSize = miniBatchSize;
用于在扩展图像数据存储数据,在训练前,设置MiniBatchSize
数据存储到小批量的特性。
augimds。MiniBatchSize = MiniBatchSize;
对于存储器内数据,在每个迭代开始训练期间,直接从阵列读取的意见。
idx = ((iteration - 1)*miniBatchSize + 1):(iteration*miniBatchSize);X = XTrain (:,:,:, idx);
指定时期的最大数量对于外部培训对于
培训环路的环路。
容易地指定的历元的最大数量,创建变量maxEpochs
包含时代的最大数量。
maxEpochs = 30;
在外对于
培训环路的环路,指定遍历范围1,2,...,maxEpochs
。
对于时代= 1:maxEpochs...结束
为了验证训练期间你的网络,预留了持有了验证集和评估如何对数据网络进行。
要轻松指定验证选项,创建变量validationData
和validationFrequency
,其中validationData
包含验证数据或者是空的并且validationFrequency
指定验证网络之间多少次迭代。
validationData = {XValidation,YValidation};validationFrequency = 50;
在培训过程中循环,更新网络参数后,测试如何在持有进行验证集网络进行使用预测
函数。验证仅当验证数据是指定的,它或者是在第一次迭代或当前迭代的网络是的倍数validationFrequency
选择。
如果迭代== 1 ||MOD(迭代,validationFrequency)== 0 dlYPredValidation =预测(dlnet,dlXValidation);lossValidation = crossentropy(SOFTMAX(dlYPredValidation),YValidation);[〜,IDX] = MAX(dlYPredValidation);labelsPredValidation =类名(IDX);accuracyValidation =平均值(labelsPredValidation == labelsValidation);结束
YValidation
是对应于在标签虚拟变量类名
。为了计算的准确性,转换YValidation
到标签阵列。
对于回归任务,调整代码,使其计算验证RMSE,而不是验证精度。
如果要在已退出验证的损失停止减少时提早停止训练,可以使用一个标志跳出训练循环。
为了方便地指定验证耐心(验证损失大于或等于网络训练停止前最小损失的次数),创建这个变量validationPatience
。
validationPatience = 5;
训练前,初始化变量earlyStop
和validationLosses
,其中earlyStop
是一个标志,停止训练和初validationLosses
包含可供比较的损失。初始化早期停止标志假
和验证损失阵列正
。
earlyStop = FALSE;如果ISFINITE(validationPatience)validationLosses = INF(1,validationPatience);结束
里面的训练循环,在循环过小批量,添加earlyStop
标志循环条件。
而hasdata(DS)&&〜earlyStop...结束
在验证步骤中,追加新的验证损失到阵列validationLosses
。如果数组的第一个元素是最小的,则设置earlyStop
标志真正
。否则,删除第一个元素。
如果validationLoss = [validationLosses validationLoss];如果min(validationLosses) == validationLosses(1) earlyStop = true;其他validationLosses(1)= [];结束结束
适用大号2正规化的权重,使用dlupdate
函数。
容易地指定为L2正则化因子,创建变量l2Regularization
包含将L2则因子。
l2Regularization = 0.0001;
在训练期间,计算所述模型的梯度后,对于每个权重参数的,添加L的产物2的正则化因子和对计算出的梯度的权重dlupdate
函数。要只更新权重参数,请提取带有名称的参数“权重”
。
IDX = dlnet.Learnables.Parameter ==“权重”;gradient (idx,:) = dlupdate(@(g,w) g + l2Regularization*w, gradient (idx,:), dll . learnables (idx,:));
加入L后2正则化参数的梯度,更新网络参数。
夹梯度,使用dlupdate
函数。
要轻松指定梯度裁剪选项,打造一个变量gradientThresholdMethod
和gradientThreshold
,其中gradientThresholdMethod
包含“全球l2norm”
,“l2norm”
, 要么“绝对值”
和gradientThreshold
是包含阈值的正标量或正
。
gradientThresholdMethod =“全球l2norm”;gradientThreshold = 2;
创建一个名为功能thresholdGlobalL2Norm
,thresholdL2Norm
和thresholdAbsoluteValue
适用的“全球l2norm”
,“l2norm”
和“绝对值”
阈值的方法,分别。
为了“全球l2norm”
选项,功能型号的所有梯度操作。
功能梯度= thresholdGlobalL2Norm(梯度,gradientThreshold)globalL2Norm = 0;对于I = 1:numel(梯度)= globalL2Norm + globalL2Norm总和(梯度{I}(:)^ 2);结束globalL2Norm = SQRT(globalL2Norm);如果globalL2Norm> gradientThreshold normScale = gradientThreshold / globalL2Norm;对于I = 1:numel(梯度)的梯度{I} =梯度{I} * normScale;结束结束结束
为了“l2norm”
和“绝对值”
选项,函数对每个梯度独立操作。
功能gradientNorm = sqrt(sum(gradient (:).^2));如果gradientNorm> gradientThreshold梯度=梯度*(gradientThreshold / gradientNorm);结束结束
功能梯度= thresholdAbsoluteValue(梯度,gradientThreshold)梯度(梯度> gradientThreshold)= gradientThreshold;梯度(梯度<-gradientThreshold)= -gradientThreshold;结束
在训练期间,计算所述模型的梯度后,应用适当的梯度裁剪方法使用梯度dlupdate
函数。由于“全球l2norm”
选项要求所有的模型梯度,应用thresholdGlobalL2Norm
直接起作用的梯度。为了“l2norm”
和“绝对值”
选择,更新独立地使用梯度dlupdate
函数。
开关gradientThresholdMethod案件“全球l2norm”梯度= thresholdGlobalL2Norm(梯度,gradientThreshold);案件“l2norm”梯度= dlupdate(@(克)thresholdL2Norm(克,gradientThreshold),梯度);案件“绝对值”梯度= dlupdate(@(克)thresholdAbsoluteValue(克,gradientThreshold),梯度);结束
施加梯度阈值操作之后,更新网络参数。
该软件默认情况下,执行仅使用CPU的计算。在单GPU列车,将数据转换到gpuArray
对象。使用GPU需要并行计算工具箱™和CUDA®启用NVIDIA®GPU计算能力3.0或更高版本。
要方便地指定执行环境,请创建变量executionEnvironment
包含其中任一“中央处理器”
,“GPU”
, 要么“汽车”
。
执行环境=“汽车”
在培训过程中,阅读小批量后,检查执行环境选项和数据转换成gpuArray
如果需要的话。该canUseGPU
功能检查可用的GPU。
如果(执行环境==“汽车”&& canUseGPU)||执行环境==“GPU”DLX = gpuArray(DLX);结束
要使用训练节省网络中保存检查站网络保存
函数。
要轻松指定关卡是否应该打开,创建变量checkpointPath
包含检查点的网络文件夹或为空。
checkpointPath =完整文件(TEMPDIR,“闯关”);
如果检查点文件夹不存在,那么在训练前,创建检查点文件夹。
如果~存在(checkpointPath“目录”)MKDIR(checkpointPath)结束
在培训过程中,在一个时代的结束,保存网络中的文件MAT。指定包含当前迭代次数,日期和时间的文件名。
如果D = datestr(现在,“yyyy_mm_dd__HH_MM_SS”);文件名=“dlnet_checkpoint__”+迭代+“__”+ D +“。垫”;保存(文件名,“dlnet”)结束
dlnet
是个dlnetwork
要保存对象。
adamupdate
|dlarray
|dlfeval
|dlgradient
|dlnetwork
|dlupdate
|rmspropupdate
|sgdmupdate