定义模型损失函数自定义训练循环
当你训练一个深度学习循环模型与一个定制的培训,软件最小化损失对可学的参数。把损失减小到最低限度,软件使用渐变的损失就可学会的参数。计算这些梯度使用自动分化,您必须定义一个模型梯度函数。
为一个例子,演示如何训练与深度学习模型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 |
使用自适应更新参数矩估计(亚当) |
rmspropupdate |
更新参数使用根均方传播(RMSProp) |
sgdmupdate |
更新参数使用随机梯度下降法和动力(个) |
lbfgsupdate |
更新参数使用内存有限bfg (L-BFGS) |
dlupdate |
更新参数使用自定义函数 |
例如,更新的可学的参数dlnetwork
对象净
使用adamupdate
函数。
[净,trailingAvg trailingAvgSq] = adamupdate(净、渐变…trailingAvg trailingAverageSq,迭代);
梯度
是渐变的损失就可学会的参数,然后呢trailingAvg
,trailingAvgSq
,迭代
所需的hyperparameters吗adamupdate
函数。
同样,更新可学的参数模型的功能参数
使用adamupdate
函数。
(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变…trailingAvg trailingAverageSq,迭代);
梯度
是渐变的损失就可学会的参数,然后呢trailingAvg
,trailingAvgSq
,迭代
所需的hyperparameters吗adamupdate
函数。
使用模型损失函数在定义培训循环
当使用一个定制的培训深入学习模型训练循环,损失评估模型和梯度和更新每个mini-batch可学的参数。
使用这个代码片段显示了一个示例dlfeval
和adamupdate
在一个自定义训练循环功能。
迭代= 0;%循环时期。为时代= 1:numEpochs%在mini-batches循环。为i = 1: numIterationsPerEpoch迭代=迭代+ 1;% mini-batch做好准备。%……%损失评估模型和梯度。(损失,梯度)= dlfeval (@modelLoss,净,X, T);%更新可学的参数。(参数、trailingAvg trailingAvgSq) = adamupdate(参数、渐变…trailingAvg trailingAverageSq,迭代);结束结束
为一个例子,演示如何训练与深度学习模型dlnetwork
对象,看到列车网络的使用自定义训练循环。一个例子,演示如何培训深入学习模型定义为一个函数,看看列车网络的使用模型的功能。
调试模型损失函数
如果模型的实现损失函数有一个问题,然后调用dlfeval
可以抛出一个错误。有时,当你使用dlfeval
功能,目前尚不清楚这行代码抛出错误。帮助定位错误,你可以试试下面的。
直接调用模型损失函数
试着直接调用模型损失函数(即不使用dlfeval
生成函数)与预期大小的输入。如果任何的代码抛出错误,错误消息可以提供额外的细节。请注意,当您不使用dlfeval
函数调用dlgradient
函数抛出一个错误。
%生成图像的输入数据。X =兰特((100年28日28日1),“单一”);X = dlarray (X);%生成一个炎热的目标数据进行编码。T = repmat(眼睛(10,“单一”),10 [1]);(损失,梯度)= modelLoss(净,X, T);
手动运行损失模型代码
运行模型损失函数内的代码手动输入生成的预期大小和检查输出和任何错误消息。
例如,考虑以下损失函数模型。
函数(损失,梯度)= modelLoss(净,X, T)%通过dlnetwork转发数据对象。Y =前进(净,X);%计算损失。损失= crossentropy (Y, T);%计算梯度。梯度= dlgradient(损失、net.Learnables);结束
检查模型损失函数通过运行以下代码。
%生成图像的输入数据。X =兰特((100年28日28日1),“单一”);X = dlarray (X);%生成一个炎热的目标数据进行编码。T = repmat(眼睛(10,“单一”),10 [1]);%检查前进传球。Y =前进(净,X);%检查损失计算。损失= crossentropy (Y, T)