在自定义培训循环中指定培训选项
控件控制训练算法的详细信息trainingOptions
而且trainNetwork
功能。如果trainingOptions
函数没有提供任务所需的选项(例如,自定义学习速率计划),则可以使用dlnetwork
对象。一个dlnetwork
对象允许您使用自动区分训练指定为层图的网络。
属性指定相同的选项trainingOptions
,用这些例子作为指导:
培训选项 | trainingOptions 论点 |
例子 |
---|---|---|
亚当解算器 | 自适应矩估计(ADAM) | |
RMSProp解算器 | 均方根传播(RMSProp) | |
个解算器 | 随机动量梯度下降法(SGDM) | |
学习速率 | “InitialLearnRate” |
学习速率 |
学习速率表 | 分段学习速率表 | |
培训进展 | “阴谋” |
情节 |
详细输出 | 详细输出 | |
Mini-batch大小 | “MiniBatchSize” |
Mini-Batch大小 |
纪元数 | “MaxEpochs” |
时代数 |
验证 | 验证 | |
l2正则化 | “L2Regularization” |
L2正规化 |
梯度剪裁 | 梯度剪裁 | |
单CPU或GPU训练 | “ExecutionEnvironment” |
单CPU / GPU培训 |
检查点 | “CheckpointPath” |
检查点 |
解算器选项
要指定求解器,请使用adamupdate
,rmspropupdate
,sgdmupdate
函数用于训练循环中的更新步骤。方法更新可学习参数,以实现自己的自定义求解器dlupdate
函数。
自适应矩估计(ADAM)
要使用Adam更新网络参数,请使用adamupdate
函数。使用相应的输入参数指定梯度衰减和梯度衰减因子的平方。
均方根传播(RMSProp)
若要使用RMSProp更新网络参数,请使用rmspropupdate
函数。使用相应的输入参数指定分母偏移量(epsilon)值。
随机动量梯度下降法(SGDM)
要使用SGDM更新网络参数,请使用sgdmupdate
函数。使用相应的输入参数指定动量。
学习速率
类的学习率输入参数可指定学习率adamupdate
,rmspropupdate
,sgdmupdate
功能。
若要轻松调整学习率或将其用于自定义学习率计划,请在自定义训练循环之前设置初始学习率。
learnRate = 0.01;
分段学习速率表
若要在使用分段学习速率计划的训练期间自动降低学习速率,请在指定的间隔后将学习速率乘以给定的下降因子。
要方便地指定分段学习速率计划,请创建变量learnRate
,learnRateSchedule
,learnRateDropFactor
,learnRateDropPeriod
,在那里learnRate
是初始学习速率,learnRateSchedule
包含两“分段”
或“没有”
,learnRateDropFactor
是否在[0,1]范围内指定降低学习速率的因子的标量,以及learnRateDropPeriod
是一个正整数,它指定在删除学习速率之间间隔多少个周期。
learnRate = 0.01;learnRateSchedule =“分段”learnratdropperiod = 10;learnratdropfactor = 0.1;
在训练循环中,在每个纪元结束时,当learnRateSchedule
选择是“分段”
而当前的纪元数是learnRateDropPeriod
.将新的学习率设置为学习率和学习率下降因子的乘积。
如果learnRateSchedule = =“分段”&& mod(epoch, learnratdroppperiod) == 0 learnRate = learnRate * learnratdroppfactor;结束
情节
为了在训练过程中绘制训练损失和精度,计算模型损失函数中的迷你批损失和精度或均方根误差(RMSE),并使用动画线绘制它们。
为了方便地指定绘图应该是打开还是关闭,请创建变量情节
它包含了“训练进步”
或“没有”
.要绘制验证指标,请使用相同的选项validationData
而且validationFrequency
中描述的验证.
情节=“训练进步”;validationData = {XValidation, YValidation};validationFrequency = 50;
在训练之前,使用animatedline
函数。对于分类任务,创建一个训练精度和训练损失的图表。当指定验证数据时,还要初始化验证指标的动画行。
如果情节= =“训练进步”lineAccuracyTrain = animatedline;ylabel (“准确性”) subplot(2,1,2) lineLossTrain = animatedline;包含(“迭代”) ylabel (“损失”)如果~isempty(validationData) subplot(2,1,1) lineAccuracyValidation = animatedline;subplot(2,1,2) lineLossValidation = animatedline;结束结束
对于回归任务,通过更改变量名称和标签来调整代码,以便它初始化训练和验证RMSE的图,而不是训练和验证精度。
在训练循环中,在迭代结束时,更新图,使其包含网络的适当指标。对于分类任务,增加对应于小批精度和小批损失的点数。如果验证数据非空,并且当前迭代是1或验证频率选项的倍数,那么也为验证数据添加点数。
如果情节= =“训练进步”addpoints (lineAccuracyTrain迭代,accuracyTrain) addpoints (lineLossTrain,迭代,lossTrain)如果~isempty(validationData) && (iteration == 1 || mod(iteration,validationFrequency) == 0) addpoints(lineAccuracyValidation,iteration,accuracyValidation) addpoints(lineLossValidation,iteration,lossValidation)结束结束
accuracyTrain
而且lossTrain
对应于模型损耗函数中计算的小批量精度和损耗。对于回归任务,使用小批量RMSE损失而不是小批量精度。
提示
的addpoints
函数要求数据点具有类型双
.从中提取数值数据dlarray
对象,使用extractdata
函数。当需要从图形处理器收集数据时,可以使用收集
函数。
要了解如何计算验证指标,请参见验证.
详细输出
若要在详细表中显示训练期间的训练损失和准确度,请计算模型损失函数中的小批损失和准确度(用于分类任务)或RMSE(用于回归任务),并使用disp
函数。
为了方便地指定verbose表是打开还是关闭,可以创建变量详细的
而且verboseFrequency
,在那里详细的
是真正的
或假
而且verbosefrequency
指定打印详细输出之间的迭代次数。要显示验证指标,请使用相同的选项validationData
而且validationFrequency
中描述的验证.
verbose = true verbose frequency = 50;validationData = {XValidation, YValidation};validationFrequency = 50;
在训练之前,显示详细输出表标题并使用抽搐
函数。
disp ("|======================================================================================================================|") disp (“|纪元|迭代|时间流逝|小批量|验证|小批量|验证|基础学习|”) disp ("| | | (hh:mm:ss) |精度|精度|损耗|损耗|速率|") disp ("|======================================================================================================================|") start = tic;
对于回归任务,调整代码,使其显示训练和验证RMSE,而不是训练和验证精度。
在训练循环内部,在迭代结束时,打印详细输出详细的
选择是真正的
它要么是第一次迭代,要么是迭代数的倍数verboseFrequency
.
如果verbose &&(迭代== 1 || mod(迭代,verboseFrequency) == 0 D = duration(0,0,toc(start),“格式”,“hh: mm: ss”);如果isempty(validationData) || mod(iteration,validationFrequency) ~= 0 accuracyValidation ="";lossValidation ="";结束disp (“|”+...垫(时代7“左”) +“|”+...垫(迭代,11日“左”) +“|”+...垫(D, 14日“左”) +“|”+...垫(accuracyTrain 12“左”) +“|”+...垫(accuracyValidation 12“左”) +“|”+...垫(lossTrain 12“左”) +“|”+...垫(lossValidation 12“左”) +“|”+...垫(learnRate 15“左”) +“|”)结束
对于回归任务,调整代码,使其显示训练和验证RMSE,而不是训练和验证精度。
训练结束后,打印详细表的最后一个边框。
disp ("|======================================================================================================================|")
要了解如何计算验证指标,请参见验证.
Mini-Batch大小
设置小批大小取决于所使用的数据存储的格式或类型。
要方便地指定迷你批处理大小,请创建一个变量miniBatchSize
.
miniBatchSize = 128;
对于图像数据存储中的数据,在训练之前,设置ReadSize
属性设置为小批处理大小。
洛桑国际管理发展学院。ReadSize = miniBatchSize;
对于增强图像数据存储中的数据,在训练之前,请设置MiniBatchSize
属性设置为小批处理大小。
augimds。MiniBatchSize = MiniBatchSize;
对于内存中的数据,在每次迭代开始时的训练中,直接从数组中读取观察值。
idx =((迭代- 1)*miniBatchSize + 1):(迭代*miniBatchSize);X = XTrain(:,:,:,idx);
时代数
指定在外层进行训练的最大epoch数为
训练循环的循环。
要方便地指定最大epoch数,请创建变量maxEpochs
它包含最大的epoch数。
maxEpochs = 30;
在外部为
训练循环的循环,指定在范围1,2,…,maxEpochs
.
为epoch = 1: maxepoch...结束
验证
为了在训练期间验证你的网络,留出一个保留的验证集,并评估网络在该数据上的表现如何。
要方便地指定验证选项,请创建变量validationData
而且validationFrequency
,在那里validationData
包含验证数据或为空validationFrequency
指定验证网络之间的迭代次数。
validationData = {XValidation,TValidation};validationFrequency = 50;
在训练循环期间,在更新网络参数之后,测试网络在保留验证集上的性能如何预测
函数。仅当指定验证数据并且是第一次迭代或当前迭代是的倍数时,才验证网络validationFrequency
选择。
如果迭代== 1 || mod(迭代,validationFrequency) == 0 YValidation = predict(net,XValidation);lossValidation = crossentropy(YValidation,TValidation);[~,idx] = max(YValidation);labelsPredValidation = classNames(idx);accuracyValidation = mean(labelsPredValidation == labelsValidation);结束
TValidation
标签的一个热编码数组结束了吗一会
.要计算精度,请转换TValidation
到标签数组。
对于回归任务,调整代码,使其计算验证RMSE而不是验证精度。
早期停止
要在保留验证上的损失停止减少时尽早停止训练,可以使用一个标志来跳出训练循环。
为了方便地指定验证耐心(在网络训练停止之前,验证损失可以大于或等于之前最小损失的次数),请创建变量validationPatience
.
validationPatience = 5;
在训练之前,初始化一个变量earlyStop
而且validationLosses
,在那里earlyStop
是提早停止训练的标志吗validationLosses
包含要比较的损失。初始化早期停止标志假
和验证损失的数组正
.
earlyStop = false;如果isfinite(validationPatience) validationLosses = inf(1,validationPatience);结束
在训练循环中,在小批量循环中,添加earlyStop
标记到循环条件。
而hasdata(ds) && ~earlyStop...结束
在验证步骤期间,将新的验证损失附加到数组validationLosses
.如果数组的第一个元素最小,则设置earlyStop
旗帜真正的
.否则,删除第一个元素。
如果isfinite(validationPatience) validationLosses = [validationLosses];如果min(validationLosses) == validationLosses(1) earlyStop = true;其他的validationLosses(1) = [];结束结束
l2正则化
应用L2权重的正则化,使用dlupdate
函数。
为了方便地指定L2正则化因子,创建变量l2Regularization
包含L的2正则化因子。
l2Regularization = 0.0001;
在训练过程中,计算模型损失和梯度后,对每个权重参数,加上L的乘积2的正则化因子和计算梯度的权重dlupdate
函数。若要仅更新权重参数,请提取带有name的参数“重量”
.
idx = net.Learnables.Parameter ==“重量”;gradients(idx,:) = dlupdate(@(g,w) g + l2Regularization*w, gradients(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”
选项,该函数对模型的所有梯度进行操作。
函数(gradients,gradientThreshold) globalL2Norm = 0;为i = 1: globalL2Norm = globalL2Norm + sum(gradients{i}(:).^2);结束globalL2Norm = sqrt(globalL2Norm);如果globalL2Norm > gradientThreshold normScale = gradientThreshold / globalL2Norm;为i = 1: number (gradients) gradients{i} = gradients{i} * normScale;结束结束结束
为“l2norm”
而且“绝对值”
选项,函数在每个梯度上独立操作。
函数gradient = thresholdL2Norm(gradients,gradientThreshold) gradientNorm =√(sum(gradients(:).^2));如果gradientNorm > gradientThreshold gradientThreshold = gradients * (gradientThreshold / gradientNorm);结束结束
函数gradient = thresholdAbsoluteValue(gradients,gradientThreshold) gradients(gradients > gradientThreshold) = gradientThreshold;gradients(gradients < -gradientThreshold) = -gradientThreshold;结束
在训练过程中,计算模型损失和梯度后,对梯度应用适当的梯度裁剪方法dlupdate
函数。因为“global-l2norm”
选项需要所有的渐变值,应用thresholdGlobalL2Norm
函数直接到梯度。为“l2norm”
而且“绝对值”
选项,可独立地使用dlupdate
函数。
开关gradientThresholdMethod情况下“global-l2norm”gradients = thresholdGlobalL2Norm(gradients, gradientThreshold);情况下“l2norm”gradients = dlupdate(@(g) thresholdL2Norm(g, gradientThreshold),gradients);情况下“绝对值”gradients = dlupdate(@(g) thresholdAbsoluteValue(g, gradientThreshold),gradients);结束
应用梯度阈值操作后,更新网络参数。
单CPU / GPU培训
默认情况下,该软件只使用CPU进行计算。要在单个GPU上训练,请将数据转换为gpuArray
对象。使用GPU需要并行计算工具箱™和受支持的GPU设备。金宝app有关受支持设备的信息,请参见金宝appGPU支金宝app持版本(并行计算工具箱).
要方便地指定执行环境,请创建变量executionEnvironment
它包含了“cpu”
,“图形”
,或“汽车”
.
executionEnvironment =“汽车”
在训练期间,读取一个小批处理后,检查执行环境选项并将数据转换为gpuArray
如果有必要的话)。的canUseGPU
函数检查可用的gpu。
如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”X = gpuArray(X);结束
检查点
要在训练期间保存检查点网络,请使用保存
函数。
为了方便地指定是否应该打开检查点,可以创建变量checkpointPath
包含检查点网络的文件夹或为空。
checkpointPath = fullfile(tempdir,“检查点”);
如果检查点文件夹不存在,那么在培训之前,创建检查点文件夹。
如果~存在(checkpointPath“dir”mkdir (checkpointPath)结束
在训练期间,在一个纪元结束时,将网络保存在MAT文件中。指定一个包含当前迭代数、日期和时间的文件名。
如果~isempty(checkpointPath) D = string(datetime(“现在”格式=“yyyy_MM_dd__HH_mm_ss”));文件名=“net_checkpoint__”+迭代+“_”+ d +“.mat”;保存(文件名,“净”)结束
网
是dlnetwork
对象。
另请参阅
adamupdate
|rmspropupdate
|sgdmupdate
|dlupdate
|dlarray
|dlgradient
|dlfeval
|dlnetwork