定义自定义训练循环的模型损失函数
当你用自定义训练循环训练一个深度学习模型时,软件将可学习参数的损失最小化。为了使损耗最小化,该软件使用了损耗相对于可学习参数的梯度。要使用自动微分计算这些梯度,必须定义一个模型梯度函数。
举个例子,展示如何训练深度学习模型dlnetwork
对象,看到使用自定义训练循环训练网络.有关演示如何训练定义为函数的深度学习模型的示例,请参见利用模型函数的列车网络.
为定义为的模型创建模型损失函数dlnetwork
对象
如果你有一个深度学习模型定义为dlnetwork
对象,然后创建一个模型丢失函数,该函数采用dlnetwork
对象作为输入。
对于指定为的模型dlnetwork
对象,创建窗体的函数(损失,梯度)= modelLoss(净,X, T)
,在那里网
是网络,X
是网络输入,T
包含目标和损失
而且梯度
分别为返回损耗和梯度。您可以选择将额外的参数传递给梯度函数(例如,如果丢失函数需要额外的信息),或者返回额外的参数(例如,更新的网络状态)。
例如,该函数返回交叉熵损失和损失相对于指定的可学习参数的梯度dlnetwork
对象网
,给定输入数据X
,目标T
.
函数(损失,梯度)= modelLoss(净,X, T)通过dlnetwork对象转发数据。Y =前进(净,X);%计算损失。损失= crossentropy (Y, T);%计算梯度。梯度= dlgradient(损失、net.Learnables);结束
为定义为函数的模型创建模型损失函数
如果您有一个定义为函数的深度学习模型,那么创建一个以模型可学习参数为输入的模型损失函数。
对于指定为函数的模型,请创建表单的函数(损失,梯度)= modelLoss(参数X, T)
,在那里参数
包含可学习参数,X
为模型输入,T
包含目标和损失
而且梯度
分别为返回损耗和梯度。您可以选择将额外的参数传递给梯度函数(例如,如果损失函数需要额外的信息),或者返回额外的参数(例如,更新的模型状态)。
例如,该函数返回交叉熵损失和损失相对于可学习参数的梯度参数
,给定输入数据X
,目标T
.
函数(损失,梯度)= modelLoss(参数X, T)通过模型函数转发数据。Y =模型(参数,X);%计算损失。损失= crossentropy (Y, T);%计算梯度。梯度= dlgradient(损失、参数);结束
评估模型损失函数
用自动微分法计算模型损失函数dlfeval
函数,该函数计算启用了自动微分的函数。对于的第一个输入dlfeval
,传递指定为函数句柄的模型丢失函数。对于以下输入,为模型损失函数传递所需的变量。的输出dlfeval
函数,指定与模型损失函数相同的输出。
例如,评估模型损失函数modelLoss
与一个dlnetwork
对象网
,输入数据X
,目标T
,返回模型损失和梯度。
(损失,梯度)= dlfeval (@modelLoss,净,X, T);
同样,计算模型损失函数modelLoss
使用结构指定的具有可学习参数的模型函数参数
,输入数据X
,目标T
,返回模型损失和梯度。
(损失,梯度)= dlfeval (@modelLoss、参数X, T);
使用梯度更新可学习参数
要使用梯度更新可学习参数,可以使用以下函数。
函数 | 描述 |
---|---|
adamupdate |
使用自适应矩估计(Adam)更新参数 |
rmspropupdate |
使用均方根传播(RMSProp)更新参数 |
sgdmupdate |
使用带动量的随机梯度下降(SGDM)更新参数 |
dlupdate |
使用自定义函数更新参数 |
例如,更新a的可学习参数dlnetwork
对象网
使用adamupdate
函数。
[净,trailingAvg trailingAvgSq] = adamupdate(净、渐变...trailingAvg trailingAverageSq,迭代);
梯度
损失的梯度相对于可学习参数,和trailingAvg
,trailingAvgSq
,迭代
类是否需要超参数adamupdate
函数。
类似地,更新模型函数的可学习参数参数
使用adamupdate
函数。
(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变...trailingAvg trailingAverageSq,迭代);
梯度
损失的梯度相对于可学习参数,和trailingAvg
,trailingAvgSq
,迭代
类是否需要超参数adamupdate
函数。
在自定义训练循环中使用模型损失函数
当使用自定义训练循环训练深度学习模型时,评估模型损失和梯度,并更新每个小批的可学习参数。
方法的示例dlfeval
而且adamupdate
自定义训练循环中的函数。
迭代= 0;循环遍历各个时代。为时代= 1:numEpochs在小批量上循环。为i = 1:numIterationsPerEpoch迭代=迭代+ 1;% mini-batch做好准备。%……评估模型损失和梯度。(损失,梯度)= dlfeval (@modelLoss,净,X, T);更新可学习参数。(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变...trailingAvg trailingAverageSq,迭代);结束结束
举个例子,展示如何用一个dlnetwork
对象,看到使用自定义训练循环训练网络.有关演示如何训练定义为函数的深度学习模型的示例,请参见利用模型函数的列车网络.
调试模型丢失函数
如果模型丢失函数的实现有问题,则调用dlfeval
会抛出错误。有时候,当你使用dlfeval
函数中,不清楚哪一行代码抛出了错误。为了帮助定位错误,您可以尝试以下方法。
直接调用模型损失函数
尝试直接调用模型损失函数(也就是说,不使用dlfeval
函数)使用生成的预期大小的输入。如果任何代码行抛出错误,则错误消息将提供额外的详细信息。注意,当您不使用dlfeval
函数的任何调用dlgradient
函数抛出错误。
生成图像输入数据。X = rand([28 28 1 100],“单一”);X = dlarray (X);生成单热编码目标数据。T = repmat(眼睛(10,“单一”), 10 [1]);(损失,梯度)= modelLoss(净,X, T);
手动运行模型丢失代码
用生成的预期大小的输入手动运行模型损失函数中的代码,并检查输出和抛出的任何错误消息。
例如,考虑下面的模型损失函数。
函数(损失,梯度)= modelLoss(净,X, T)通过dlnetwork对象转发数据。Y =前进(净,X);%计算损失。损失= crossentropy (Y, T);%计算梯度。梯度= dlgradient(损失、net.Learnables);结束
运行以下代码检查模型丢失函数。
生成图像输入数据。X = rand([28 28 1 100],“单一”);X = dlarray (X);生成单热编码目标数据。T = repmat(眼睛(10,“单一”), 10 [1]);%检查转发通过。Y =前进(净,X);检查损失计算。损失= crossentropy (Y, T)