当您使用自定义训练循环训练深度学习模型时,软件最小化了了解学习参数的损失。为了最大限度地减少损失,软件将相对于学习参数的损失梯度使用。要使用自动差异计算这些渐变,必须定义模型渐变功能。
有一个例子,展示如何用一个培训深度学习模型dlnetwork.
对象,参见使用自定义培训循环列车网络。有关展示如何培训定义为函数的深度学习模型的示例,请参阅使用模型功能列车网络。
dlnetwork.
目的如果您有一个深入的学习模型,定义为adlnetwork.
对象,然后创建一个型号渐变函数,它dlnetwork.
对象作为输入。
对于指定为a的模型dlnetwork.
对象,创建表单的函数梯度= Maposgradients(DLNET,DLX,T)
, 在哪里DLNET.
是网络,DLX.
是网络输入,T.
包含目标,和梯度
包含返回的渐变。可选地,您可以将额外的参数传递给梯度函数(例如,如果丢失函数需要额外信息),或返回额外的参数(例如,绘制培训进度的指标)。
例如,此函数返回指定的渐变和跨熵丢失dlnetwork.
目的DLNET.
, 输入数据DLX.
和目标T.
。
功能[梯度,损失] = MaposGRadients(DLNET,DLX,T)通过DLNetwork对象的%转发数据。dly = forward(dlnet,dlx);%计算损失。损失=联语(DLY,T);%计算渐变。梯度= Dlgradient(损失,DLNET);结尾
如果您有一个定义为函数的深度学习模型,则创建一个模型渐变功能,该函数将型号可知参数作为输入。
对于指定为函数的模型,请创建表单的函数梯度= MapeStrients(参数,DLX,T)
, 在哪里参数
包含可知参数,DLX.
是模型输入,T.
包含目标,和梯度
包含返回的渐变。可选地,您可以将额外的参数传递给梯度函数(例如,如果丢失函数需要额外信息),或返回额外的参数(例如,绘制培训进度的指标)。
例如,此功能返回深度学习模型功能的渐变和跨熵损耗模型
使用指定的学习参数参数
, 输入数据DLX.
和目标T.
。
功能[梯度,损失] = MaposGRadients(参数,DLX,T)通过模型函数重新转发数据。dly =模型(参数,dlx);%计算损失。损失=联语(DLY,T);%计算渐变。梯度= Dlgradient(损失,参数);结尾
要使用自动分化评估模型梯度,请使用dlfeval.
函数,它评估启用自动差异的函数。对于第一个输入dlfeval.
,通过指定为函数句柄指定的模型渐变函数。对于以下输入,请传递模型渐变功能的所需变量。对于输出的输出dlfeval.
函数,指定与模型渐变功能相同的输出。
例如,评估模型梯度函数MapicalGRADENTERS.
与A.dlnetwork.
目的DLNET.
, 输入数据DLX.
和目标T.
,并返回模型渐变和损耗。
[渐变,损失] = DLFeval(@ Maposgradients,Dlnet,DLX,T);
同样,评估模型梯度函数MapicalGRADENTERS.
使用模型函数具有由结构指定的可知参数参数
, 输入数据DLX.
和目标T.
,并返回模型渐变和损耗。
[渐变,损失] = DLFeval(@ MaseGradients,参数,DLX,T);
要使用渐变更新可读参数,可以使用以下功能。
功能 | 描述 |
---|---|
adamupdate. |
使用Adaptive Sonment估算更新参数(ADAM) |
rmspropupdate. |
使用root均方平方传播更新参数(RMSPROP) |
sgdmupdate. |
使用随机梯度下降使用动量(SGDM)更新参数 |
dlupdate. |
使用自定义功能更新参数 |
例如,更新可知的参数dlnetwork.
目的DLNET.
使用adamupdate.
功能。
[Dlnet,trailingavg,trailingavgsq] = adamupdate(Dlnet,渐变,......trailighavg,trailingaveragesq,迭代);
梯度
是模型渐变功能的输出,以及拖车
那trailingavgsq.
, 和迭代
是所需的普遍参数adamupdate.
功能。
同样,更新模型函数的可读参数参数
使用adamupdate.
功能。
[参数,trailingavg,trailingavgsq] = adamupdate(参数,渐变,......trailighavg,trailingaveragesq,迭代);
梯度
是模型渐变功能的输出,以及拖车
那trailingavgsq.
, 和迭代
是所需的普遍参数adamupdate.
功能。
使用自定义训练循环培训深度学习模型时,评估模型渐变并更新每个迷你批处理的可读参数。
此代码片段显示使用使用的示例dlfeval.
和adamupdate.
在自定义训练循环中的函数。
迭代= 0;%循环epochs。为了epoch = 1:numepochs%循环在迷你批次。为了i = 1:numiterationsPerepoch迭代=迭代+ 1;%准备迷你批次。%......%评估模型梯度。[渐变,损失] = DLFeval(@ Maposgradients,Dlnet,DLX,T);%更新可知参数。[参数,trailingavg,trailingavgsq] = adamupdate(参数,渐变,......trailighavg,trailingaveragesq,迭代);结尾结尾
有一个例子,展示如何用一个训练深度学习模型dlnetwork.
对象,参见使用自定义培训循环列车网络。有关展示如何培训定义为函数的深度学习模型的示例,请参阅使用模型功能列车网络。
如果模型渐变函数的实现有问题,则呼叫dlfeval.
可以抛出错误。有时,当你使用时dlfeval.
函数,不清楚哪一行代码正在抛出错误。要帮助找到错误,可以尝试以下操作。
尝试直接调用模型渐变函数(即,不使用dlfeval.
功能)具有生成的预期大小的输入。如果任何行的代码行抛出错误,则错误消息提供额外的详细信息。请注意,当您不使用时dlfeval.
功能,任何呼叫Dlgradient.
功能抛出错误。
%生成图像输入数据。x = rand([28 28 1 100],'单身的');dlx = dlarray(dlx);%生成一个热编码的目标数据。t = repmat(眼睛(10,'单身的'),[1 10]);[梯度,损失] = MaposGRadients(DLNET,DLX,T);
使用生成的预期大小的生成输入运行模型渐变内的代码,并检查输出和任何抛出的错误消息。
例如,考虑以下模型渐变功能。
功能[梯度,损失] = MaposGRadients(DLNET,DLX,T)通过DLNetwork对象的%转发数据。dly = forward(dlnet,dlx);%计算损失。损失=联语(DLY,T);%计算渐变。梯度= Dlgradient(损失,DLNET);结尾
通过运行以下代码检查模型渐变功能。
%生成图像输入数据。x = rand([28 28 1 100],'单身的');dlx = dlarray(dlx);%生成一个热编码的目标数据。t = repmat(眼睛(10,'单身的'),[1 10]);%检查转发通过。dly = forward(dlnet,dlx);%检查损耗计算。损失=联语(DLX,T)