主要内容

定义自定义训练循环的模型损失函数

当你用一个定制的训练循环训练一个深度学习模型时,软件会最小化相对于可学习参数的损失。为了最小化损失,软件使用相对于可学习参数的损失梯度。要使用自动微分计算这些梯度,必须定义一个模型梯度函数。

举个例子来说明如何训练深度学习模型dlnetwork对象,看到使用自定义训练环路训练网络.有关如何训练定义为函数的深度学习模型的示例,请参见使用模型函数的列车网络

为定义的模型创建模型损失函数dlnetwork对象

如果你有一个深度学习模型定义为dlnetwork对象,然后创建一个模型损失函数dlnetwork对象作为输入。

对于指定为a的模型dlnetwork对象,创建窗体的函数[loss,gradients] = modelLoss(net,X,T),在那里是网络,X为网络输入,T包含目标,和损失梯度分别为返回损耗和梯度。您可以选择向gradients函数传递额外的参数(例如,如果损失函数需要额外的信息),或者返回额外的参数(例如,更新的网络状态)。

例如,这个函数返回交叉熵损失和损失相对于指定的可学习参数的梯度dlnetwork对象,给定输入数据X,目标T

函数[loss,gradients] = modelLoss(net,X,T)%通过dlnetwork对象转发数据。Y = forward(net,X);%计算损失。损失=交叉熵(Y,T);%计算梯度。gradients = dlgradient(loss,net.Learnables);结束

为定义为Function的模型创建模型损失函数

如果你有一个定义为函数的深度学习模型,那么创建一个以模型可学习参数作为输入的模型损失函数。

对于指定为函数的模型,创建窗体的函数[loss,gradients] = modelLoss(parameters,X,T),在那里参数包含可学习参数,X为模型输入,T包含目标,和损失梯度分别为返回损耗和梯度。您可以选择向gradients函数传递额外的参数(例如,如果损失函数需要额外的信息),或者返回额外的参数(例如,更新的模型状态)。

例如,这个函数返回交叉熵损失和损失相对于可学习参数的梯度参数,给定输入数据X,目标T

函数[loss,gradients] = modelLoss(parameters,X,T)%通过模型函数转发数据。Y = model(parameters,X);%计算损失。损失=交叉熵(Y,T);%计算梯度。Gradients = dlgradient(损失,参数);结束

评估模型损失函数

要使用自动微分来评估模型损失函数,请使用dlfeval函数,该函数对启用了自动区分的函数求值。对于的第一个输入dlfeval,传递作为函数句柄指定的模型损失函数。对于以下输入,传递模型损失函数所需的变量。的输出dlfeval函数,指定与模型损失函数相同的输出。

例如,评估模型损失函数modelLoss与一个dlnetwork对象,输入数据X,目标T,并返回模型损失和梯度。

[loss,gradients] = dlfeval(@modelLoss,net,X,T);

同样,计算模型损失函数modelLoss使用由结构指定的具有可学习参数的模型函数参数,输入数据X,目标T,并返回模型损失和梯度。

[loss,gradients] = dlfeval(@modelLoss,parameters,X,T);

使用梯度更新可学习参数

要使用梯度更新可学习参数,可以使用以下函数。

函数 描述
adamupdate 使用自适应矩估计(Adam)更新参数
rmspropupdate 使用均方根传播(RMSProp)更新参数
sgdmupdate 基于随机动量梯度下降(SGDM)的参数更新
lbfgsupdate 使用有限内存BFGS (L-BFGS)更新参数
dlupdate 使用自定义函数更新参数

例如,更新a的可学习参数dlnetwork对象使用adamupdate函数。

[net,trailingAvg,trailingAvgSq] = adamupdate(net,gradients,trailingAvg trailingAverageSq,迭代);
在这里,梯度损失对可学习参数的梯度是多少trailingAvgtrailingAvgSq,迭代的超参数是否必需adamupdate函数。

类似地,更新模型函数的可学习参数参数使用adamupdate函数。

[parameters,trailingAvg,trailingAvgSq] = adamupdate(参数,梯度,trailingAvg trailingAverageSq,迭代);
在这里,梯度损失对可学习参数的梯度是多少trailingAvgtrailingAvgSq,迭代的超参数是否必需adamupdate函数。

使用模型损失函数自定义训练循环

当使用自定义训练循环训练深度学习模型时,评估模型损失和梯度,并更新每个小批的可学习参数。

方法的示例dlfevaladamupdate自定义训练循环中的函数。

迭代= 0;%循环遍历。epoch = 1:numEpochs%小批量循环。i = 1:numIterationsPerEpoch迭代=迭代+ 1;准备小批量。%……评估模型损失和梯度。[loss,gradients] = dlfeval(@modelLoss,net,X,T);%更新可学习参数。[parameters,trailingAvg,trailingAvgSq] = adamupdate(参数,梯度,trailingAvg trailingAverageSq,迭代);结束结束

例如,如何训练一个深度学习模型dlnetwork对象,看到使用自定义训练环路训练网络.有关如何训练定义为函数的深度学习模型的示例,请参见使用模型函数的列车网络

调试模型损失函数

如果模型损失函数的实现有问题,则调用dlfeval可以抛出错误。有时,当你使用dlfeval函数时,不清楚是哪一行代码抛出错误。为了帮助定位错误,您可以尝试以下方法。

呼叫模型直接损失函数

尝试直接调用模型损失函数(即,不使用dlfeval函数),并生成预期大小的输入。如果任何一行代码抛出错误,那么错误消息将提供额外的细节。请注意,当您不使用dlfeval函数的任何调用dlgradient函数抛出错误。

%生成图像输入数据。X = rand([28 28 1 100],“单一”);X = darray (X);%生成一次性编码的目标数据。T =修复(眼);“单一”), 10 [1]);[loss,gradients] = modelLoss(net,X,T);

手动运行模型丢失代码

手动运行模型损失函数内的代码,生成预期大小的输入,并检查输出和任何抛出的错误消息。

例如,考虑下面的模型损失函数。

函数[loss,gradients] = modelLoss(net,X,T)%通过dlnetwork对象转发数据。Y = forward(net,X);%计算损失。损失=交叉熵(Y,T);%计算梯度。gradients = dlgradient(loss,net.Learnables);结束

运行以下代码检查模型损失函数。

%生成图像输入数据。X = rand([28 28 1 100],“单一”);X = darray (X);%生成一次性编码的目标数据。T =修复(眼);“单一”), 10 [1]);%检查向前通过。Y = forward(net,X);%检查损失计算。loss = crossentropy(Y,T)

相关的话题