主要内容

在自定义培训循环中指定培训选项

控件控制训练算法的详细信息trainingOptionstrainNetwork功能。如果trainingOptions函数不提供任务所需的选项(例如,自定义学习率计划),那么您可以使用dlnetwork对象。一个dlnetwork对象允许您使用自动微分训练指定为层图的网络。

方法指定相同的选项trainingOptions,用这些例子作为指导:

解算器选项

要指定求解器,请使用adamupdatermspropupdate,sgdmupdate训练循环中更新步骤的函数。方法更新可学习参数以实现您自己的自定义求解器dlupdate函数。

自适应矩估计

要使用Adam更新网络参数,请使用adamupdate函数。使用相应的输入参数指定梯度衰减和梯度衰减因子的平方。

均方根传播(RMSProp)

要使用RMSProp更新网络参数,请使用rmspropupdate函数。使用相应的输入参数指定分母偏移量(epsilon)值。

随机动量梯度下降(SGDM)

要使用SGDM更新网络参数,请使用sgdmupdate函数。使用相应的输入参数指定动量。

学习速率

方法的学习速率输入参数来指定学习速率adamupdatermspropupdate,sgdmupdate功能。

要轻松调整学习率或将其用于自定义学习率计划,请在自定义训练循环之前设置初始学习率。

learnRate = 0.01;

分段学习率计划

要使用分段学习率计划在训练期间自动降低学习率,请在指定间隔后将学习率乘以给定的下降因子。

要方便地指定分段学习率计划,请创建变量learnRatelearnRateSchedulelearnRateDropFactor,learnRateDropPeriod,在那里learnRate是初始学习率,learnRateSchedule包含两“分段”“没有”learnRateDropFactor是否有一个在[0,1]范围内的标量指定了降低学习率的因素,并且learnRateDropPeriod是一个正整数,指定在丢弃学习率之间有多少个epoch。

learnRate = 0.01;learnRateSchedule =“分段”learnRateDropPeriod = 10;learnRateDropFactor = 0.1;

在训练循环中,在每个epoch的末尾,当learnRateSchedule选择是“分段”当前纪元数是的倍数learnRateDropPeriod.将新的学习率设置为学习率与学习率下降因子的乘积。

如果learnRateSchedule = =“分段”&& mod(epoch,learnRateDropPeriod) == 0 learnRate = learnRate * learnRateDropFactor;结束

情节

为了绘制训练过程中的训练损失和准确性,计算模型损失函数中的小批量损失和准确性或均方根误差(RMSE),并使用动画线绘制它们。

为了方便地指定绘图应该打开还是关闭,创建变量情节它包含了“训练进步”“没有”.要绘制验证指标,请使用相同的选项validationDatavalidationFrequency中描述的验证

情节=“训练进步”;validationData = {XValidation, YValidation};validationFrequency = 50;

控件初始化动画线条animatedline函数。对于分类任务,创建一个训练精度和训练损失的图。当指定验证数据时,还要为验证度量初始化动画行。

如果情节= =“训练进步”图subplot(2,1,1) lineAccuracyTrain = animatedlineylabel (“准确性”) 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)结束结束
在哪里accuracyTrainlossTrain对应于模型损失函数中计算的小批量精度和损失。对于回归任务,使用小批RMSE损失而不是小批精度。

提示

addpoints函数要求数据点具有类型.中提取数值数据dlarray对象,使用extractdata函数。从图形处理器采集数据时,使用收集函数。

要了解如何计算验证指标,请参见验证

详细输出

要在详细表中显示训练过程中的训练损失和准确性,请计算模型损失函数中的小批量损失和准确性(用于分类任务)或RMSE(用于回归任务),并使用disp函数。

为了方便地指定详细表是打开还是关闭,可以创建变量详细的verboseFrequency,在那里详细的真正的verbosefrequency指定打印详细输出之间的迭代次数。要显示验证指标,请使用相同的选项validationDatavalidationFrequency中描述的验证

verbose = true verboseFrequency = 50;validationData = {XValidation, YValidation};validationFrequency = 50;

在进行训练之前,显示详细的输出表标题,并使用抽搐函数。

disp ("|======================================================================================================================|") disp (| Epoch | Iteration |时间流逝|小批量|验证|小批量|验证|基础学习|) disp ("| | | (hh:mm:ss) |准确度|准确度|损耗|损耗|速率|") disp ("|======================================================================================================================|") start = tic;

对于回归任务,调整代码,使其显示训练和验证RMSE,而不是训练和验证准确性。

在训练循环中,在迭代结束时,输出详细的输出详细的选择是真正的它要么是第一次迭代要么是迭代数的倍数verboseFrequency

如果verbose && (iteration == 1 || mod(iteration,verboseFrequency) == 0 D = duration(0,0,toc(start),“格式”“hh: mm: ss”);如果isempty(validationData) || mod(iteration,validationFrequency) ~= 0”“;lossValidation =”“;结束disp (“|”+垫(时代7“左”) +" b| "+垫(迭代,11日“左”) +" b| "+垫(D, 14日“左”) +" b| "+垫(accuracyTrain 12“左”) +" b| "+垫(accuracyValidation 12“左”) +" b| "+垫(lossTrain 12“左”) +" b| "+垫(lossValidation 12“左”) +" b| "+垫(learnRate 15“左”) +“|”结束

对于回归任务,调整代码,使其显示训练和验证RMSE,而不是训练和验证准确性。

训练完成后,打印详细表的最后一个边框。

disp ("|======================================================================================================================|"

要了解如何计算验证指标,请参见验证

Mini-Batch大小

设置小批大小取决于所使用的数据格式或数据存储类型。

要方便地指定迷你批处理大小,请创建一个变量miniBatchSize

miniBatchSize = 128;

对于图像数据存储中的数据,在训练之前,设置ReadSize属性设置为迷你批处理大小。

洛桑国际管理发展学院。ReadSize = miniBatchSize;

对于增强图像数据存储中的数据,在训练之前设置MiniBatchSize属性设置为迷你批处理大小。

augimds。MiniBatchSize = MiniBatchSize;

对于内存中的数据,在每次迭代开始的训练期间,直接从数组中读取观察值。

idx = ((iteration - 1)*miniBatchSize + 1):(iteration*miniBatchSize);X = XTrain(:,:,:,idx);

纪元数

指定训练的最大epoch数训练循环的循环。

要方便地指定最大epoch数,请创建该变量maxEpochs它包含了最大的历元数。

maxEpochs = 30;

在外面训练循环的循环,指定在1,2,…范围内循环,maxEpochs

epoch = 1:maxEpochs结束

验证

为了在训练期间验证您的网络,请留出一个固定的验证集,并评估网络在该数据上的表现。

要方便地指定验证选项,请创建变量validationDatavalidationFrequency,在那里validationData包含验证数据或为空和validationFrequency指定验证网络之间的迭代次数。

validationData = {XValidation,TValidation};validationFrequency = 50;

在训练循环期间,在更新网络参数之后,使用预测函数。只有当指定了验证数据,并且验证数据是第一次迭代或者当前迭代是的倍数时,才验证网络validationFrequency选择。

如果迭代== 1 b| mod(迭代,validationFrequency) == 0 YValidation = predict(net,XValidation);lossValidation = crossentropy(YValidation,TValidation);[~,idx] = max(YValidation);labelsPredValidation = classNames(idx);accuryvalidation = mean(labelsPredValidation == labelsValidation);结束
在这里,TValidation标签的单热编码数组结束了吗一会.要计算精度,请转换TValidation到标签数组。

对于回归任务,调整代码,使其计算验证RMSE而不是验证精度。

早期停止

为了在hold out验证的损失停止减少时尽早停止训练,可以使用标志来中断训练循环。

为了方便地指定验证耐心(在网络训练停止之前,验证损失可以大于或等于先前最小损失的次数),可以创建这个变量validationPatience

validationPatience = 5;

在训练之前,初始化变量earlyStopvalidationLosses,在那里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它包含L2正则化因子。

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函数。

为了方便地指定渐变剪辑选项,创建变量gradientThresholdMethodgradientThreshold,在那里gradientThresholdMethod包含“global-l2norm”“l2norm”,或“绝对值”,gradientThreshold正标量是否包含阈值或

gradientThresholdMethod =“global-l2norm”;gradientThreshold = 2;

创建名为thresholdGlobalL2NormthresholdL2Norm,thresholdAbsoluteValue应用于“global-l2norm”“l2norm”,“绝对值”阈值方法。

“global-l2norm”选项,该函数对模型的所有梯度进行操作。

函数gradients = thresholdGlobalL2Norm(gradients,gradientThreshold)i = 1:numel(gradients) globalL2Norm = globalL2Norm + sum(gradients{i}(:).^2);结束globalL2Norm = sqrt(globalL2Norm);如果globalL2Norm > gradientThreshold normScale = gradientThreshold / globalL2Norm;i = 1: nummel (gradients) gradients{i} = gradients{i} * normScale;结束结束结束

“l2norm”“绝对值”选项,函数在每个梯度上独立操作。

函数gradients = thresholdL2Norm(gradients,gradientThreshold) gradientNorm = sqrt(sum(gradients(:).^2));如果gradientThreshold = gradients * (gradientThreshold / gradientNorm);结束结束
函数gradients = thresholdAbsoluteValue(gradients,gradientThreshold) gradients(gradients > gradientThreshold) = gradientThreshold;gradients(gradients < -gradientThreshold) = -gradientThreshold;结束

在训练过程中,计算模型损失和梯度后,对梯度应用适当的梯度裁剪方法dlupdate函数。因为“global-l2norm”选项需要所有的渐变值,应用thresholdGlobalL2Norm函数直接到梯度。为“l2norm”“绝对值”选项中独立更新渐变dlupdate函数。

开关gradientThresholdMethod情况下“global-l2norm”gradient = thresholdGlobalL2Norm(gradients, gradientThreshold);情况下“l2norm”gradients = dlupdate(@(g) thresholdL2Norm(g, gradientThreshold),gradients);情况下“绝对值”gradients = dlupdate(@(g) thresholdAbsoluteValue(g, gradientThreshold),gradients);结束

应用梯度阈值操作后,更新网络参数。

单CPU或GPU训练

默认情况下,该软件仅使用CPU执行计算。要在单个GPU上进行训练,请将数据转换为gpuArray对象。使用GPU需要Parallel Computing Toolbox™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝app不同版本金宝app的GPU支持(并行计算工具箱)

要方便地指定执行环境,请创建变量executionEnvironment它包含了“cpu”“图形”,或“汽车”

executionEnvironment =“汽车”

在训练期间,在读取迷你批处理后,检查执行环境选项并将数据转换为gpuArray如果有必要的话)。的canUseGPU功能检查可用的gpu。

如果(executionEnvironment = =“汽车”&& canUseGPU) || executionEnvironment ==“图形”X = gpuArray(X);结束

检查点

在训练期间保存检查点网络,使用保存函数。

为了方便地指定检查点是否应该打开,创建这个变量checkpointPath包含检查点网络的文件夹或为空。

checkpointPath = fullfile(tempdir,“检查点”);

如果检查点文件夹不存在,那么在训练之前,创建检查点文件夹。

如果~存在(checkpointPath“dir”mkdir (checkpointPath)结束

在训练期间,在epoch结束时,将网络保存在MAT文件中。指定一个包含当前迭代次数、日期和时间的文件名。

如果~isempty(checkpointPath) D = string(datetime)“现在”格式=“yyyy_MM_dd__HH_mm_ss”));文件名=“net_checkpoint__”+迭代+“_”+ d +“.mat”;保存(文件名,“净”结束
在哪里dlnetwork要保存的对象。

另请参阅

|||||||

相关的话题