主要内容

定义自定义训练循环的模型梯度函数

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

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

创建模型梯度函数的模型定义为dlnetwork对象

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

指定为dlnetwork对象,创建窗体的函数梯度= modelGradients (dlnet dlX T),在那里dlnet是网络,dlX是网络输入,T包含目标,和梯度包含返回的渐变。您可以选择将额外的参数传递给gradient函数(例如,如果loss函数需要额外的信息),或者返回额外的参数(例如,绘制训练进度的度量)。

例如,这个函数返回指定的梯度和交叉熵损失dlnetwork对象dlnet,输入数据dlX,目标T

函数[gradients, loss] = modelGradients(dlnet, dlX, T)%通过dlnetwork对象转发数据。海底=前进(dlnet dlX);%计算损失。损失= crossentropy(海底,T);%计算梯度。梯度= dlgradient(损失、dlnet);结束

为定义为函数的模型创建模型梯度函数

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

对于指定为函数的模型,创建表单的函数梯度= modelGradients(参数、dlX T),在那里参数包含可学习参数,dlX是模型输入,T包含目标,和梯度包含返回的渐变。您可以选择将额外的参数传递给gradient函数(例如,如果loss函数需要额外的信息),或者返回额外的参数(例如,绘制训练进度的度量)。

例如,该函数返回深度学习模型函数的梯度和交叉熵损失模型具有指定的可学习参数参数,输入数据dlX,目标T

函数[gradients, loss] = modelGradients(parameters, dlX, T)%通过模型函数转发数据。海底=模型(参数,dlX);%计算损失。损失= crossentropy(海底,T);%计算梯度。梯度= dlgradient(损失、参数);结束

评估模型梯度函数

使用自动分化评估模型梯度,使用dlfeval函数,它计算启用了自动微分的函数。的第一个输入dlfeval,将模型梯度函数指定为函数句柄。对于以下输入,传递模型梯度函数所需的变量。的输出dlfeval函数,指定与模型梯度函数相同的输出。

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

[gradients, loss] = dlfeval(@modelGradients, dlX,T);

同样,评估模型梯度函数modelGradients使用模型函数与可学习的参数指定的结构参数,输入数据dlX,目标T,返回模型梯度和损失。

[gradients, loss] = dlfeval(@modelGradients,parameters,dlX,T);

使用梯度更新可学习参数

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

函数 描述
adamupdate 使用自适应矩估计(Adam)更新参数
rmspropupdate 使用均方根传播(RMSProp)更新参数
sgdmupdate 利用随机动量梯度下降法(SGDM)更新参数
dlupdate 使用自定义函数更新参数

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

[dlnet, trailingAvg trailingAvgSq] = adamupdate (dlnet、渐变...trailingAvg trailingAverageSq,迭代);
梯度模型的输出是梯度函数,和trailingAvgtrailingAvgSq,迭代是否需要超参数adamupdate函数。

同样,更新模型函数的可学习参数参数使用adamupdate函数。

(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变...trailingAvg trailingAverageSq,迭代);
梯度模型的输出是梯度函数,和trailingAvgtrailingAvgSq,迭代是否需要超参数adamupdate函数。

在自定义训练循环中使用模型梯度函数

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

此代码片段显示了使用dlfevaladamupdate自定义培训循环中的函数。

迭代= 0;%遍历纪元。时代= 1:numEpochs%循环小批处理。i = 1:numIterationsPerEpoch迭代=迭代+ 1;% mini-batch做好准备。%……%评估模型梯度。[gradients, loss] = dlfeval(@modelGradients, dlX,T);%更新可学习参数。(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变...trailingAvg trailingAverageSq,迭代);结束结束

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

调试模型梯度函数

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

直接调用模型梯度函数

尝试直接调用模型gradient函数(也就是说,不使用dlfeval函数),并生成预期大小的输入。如果任何代码行抛出错误,则错误消息将提供额外的详细信息。注意,当你不使用dlfeval函数的任何调用dlgradient函数抛出错误。

%生成图像输入数据。X = rand([28 28 1 100],“单一”);dlX = dlarray (dlX);%生成一个热编码的目标数据。T = repmat(眼睛(10,“单一”), 10 [1]);[gradients, loss] = modelGradients(dlnet,dlX,T);

手动运行模型渐变代码

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

例如,考虑下面的模型梯度函数。

函数[gradients, loss] = modelGradients(dlnet, dlX, T)%通过dlnetwork对象转发数据。海底=前进(dlnet dlX);%计算损失。损失= crossentropy(海底,T);%计算梯度。梯度= dlgradient(损失、dlnet);结束

运行以下代码检查模型梯度函数。

%生成图像输入数据。X = rand([28 28 1 100],“单一”);dlX = dlarray (dlX);%生成一个热编码的目标数据。T = repmat(眼睛(10,“单一”), 10 [1]);%检查forward pass。海底=前进(dlnet dlX);检查损失计算。损失= crossentropy (dlX, T)

相关的话题