主要内容

定义Model梯度函数以进行自定义训练循环

当您使用自定义训练循环训练深度学习模型时,软件最小化了了解学习参数的损失。为了最大限度地减少损失,软件将相对于学习参数的损失梯度使用。要使用自动差异计算这些渐变,必须定义模型渐变功能。

有一个例子,展示如何用一个培训深度学习模型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)

相关话题