定义自定义训练循环,损失函数和网络
对于大多数深度学习任务,您可以使用预先训练的网络,并使其适应您自己的数据。有关演示如何使用迁移学习重新训练卷积神经网络对一组新图像进行分类的示例,请参见训练深度学习网络对新图像进行分类.或者,您可以使用layerGraph
的对象trainNetwork
而且trainingOptions
功能。
如果trainingOptions
函数没有提供任务所需的训练选项,那么可以使用自动区分创建自定义训练循环。要了解更多,请参见为自定义训练循环定义深度学习网络.
如果深度学习工具箱™不提供任务所需的层(包括指定丢失函数的输出层),则可以创建自定义层。要了解更多,请参见定义自定义深度学习层.对于不能使用输出层指定的损耗函数,可以在自定义训练循环中指定损耗。要了解更多,请参见指定的损失函数.对于不能使用层图创建的网络,您可以将自定义网络定义为一个函数。要了解更多,请参见定义网络为模型函数.
有关针对哪个任务使用哪种训练方法的更多信息,请参见在MATLAB中训练深度学习模型.
为自定义训练循环定义深度学习网络
网络定义为dlnetwork
对象
方法可以控制训练算法细节trainingOptions
而且trainNetwork
功能。如果trainingOptions
函数没有提供任务所需的选项(例如,自定义学习速率计划),那么可以使用dlnetwork
对象。一个dlnetwork
对象允许您使用自动区分训练指定为层图的网络。
对于指定为层图的网络,您可以创建一个dlnetwork
对象从层图中创建dlnetwork
直接函数。
网= dlnetwork (lgraph);
所支持的层的列表dlnetwork
对象,看到支持层部分的dlnetwork
页面。有关演示如何使用自定义学习速率计划训练网络的示例,请参见使用自定义训练循环训练网络.
定义网络为模型函数
对于不能使用层图创建的体系结构(例如,需要共享权重的Siamese网络),您可以将模型定义为表单的函数(日元…, YM] =模型(参数X1,…,XN)
,在那里参数
包含网络参数,X1,…,XN
控件的输入数据N
模型的输入,日元…,
对应于米
模型输出。要训练定义为函数的深度学习模型,请使用自定义训练循环。示例请参见利用模型函数的列车网络.
将深度学习模型定义为函数时,必须手动初始化层权重。有关更多信息,请参见初始化模型函数的可学习参数.
如果将自定义网络定义为函数,那么模型函数必须支持自动区分。您可以使用以下深度学习操作。这里列出的函数只是一个子集。以获取支持的函数的完整列表dlarray
输入,看到dlarray支持的函数列表.
函数 | 描述 |
---|---|
注意 |
注意力运算使用加权乘法运算聚焦于输入的部分。 |
avgpool |
平均池操作通过将输入划分到池区域并计算每个区域的平均值来执行下采样。 |
batchnorm |
批处理归一化操作独立地对每个通道的所有观察数据的输入数据进行归一化。为了加快卷积神经网络的训练速度,降低网络初始化的敏感性,可以在卷积和非线性操作之间使用批处理归一化线性整流函数(Rectified Linear Unit) . |
crossentropy |
交叉熵运算计算单标签和多标签分类任务中网络预测值与目标值之间的交叉熵损失。 |
crosschannelnorm |
跨通道规范化操作使用不同通道中的本地响应来规范化每个激活。跨渠道正常化通常遵循线性整流函数(Rectified Linear Unit) 操作。跨通道规范化也称为局部响应规范化。 |
ctc |
CTC操作计算未对齐序列之间的连接时态分类(CTC)损失。 |
dlconv |
卷积运算对输入数据应用滑动滤波器。使用dlconv 函数的深度学习卷积,分组卷积,和通道可分离卷积。 |
dlode45 |
神经常微分方程(ODE)运算返回指定常微分方程的解。 |
dltranspconv |
转置卷积操作上采样特征映射。 |
嵌入 |
嵌入操作将数值指标转换为数值向量,其中指标对应于离散数据。使用嵌入将离散数据(如类别值或单词)映射到数值向量。 |
fullyconnect |
完全连接操作将输入乘以一个权重矩阵,然后添加一个偏置向量。 |
gelu |
高斯误差线性单元(GELU)激活操作根据其在高斯分布下的概率对输入进行加权。 |
groupnorm |
组归一化操作对每个观测的输入数据分别进行归一化处理。为了加快卷积神经网络的训练速度,降低网络初始化的敏感性,在卷积和非线性操作之间使用分组归一化线性整流函数(Rectified Linear Unit) . |
格勒乌 |
门控循环单元(GRU)操作允许网络学习时间序列和序列数据中时间步之间的依赖关系。 |
休伯 |
Huber运算计算回归任务的网络预测和目标值之间的Huber损失。当“TransitionPoint” 选项是1,这也被称为光滑的l1损失. |
instancenorm |
实例规范化操作为每个观察独立地规范化跨每个通道的输入数据。为了提高卷积神经网络训练的收敛性和降低对网络超参数的敏感性,在卷积和非线性操作之间使用实例归一化线性整流函数(Rectified Linear Unit) . |
l1loss |
L1损失运算计算L1损失给定网络预测和目标值。当减少 选择是“和” 和NormalizationFactor 选择是“批大小” ,其计算值称为平均绝对误差(MAE)。 |
l2loss |
L2损失运算计算L2损失(基于平方L2Norm)给出网络预测和目标值。当减少 选择是“和” 和NormalizationFactor 选择是“批大小” ,计算值称为均方误差(MSE)。 |
layernorm |
层归一化操作对每个观测的所有通道的输入数据进行了独立的归一化。为了加快循环和多层感知器神经网络的训练,降低网络初始化的敏感性,可在可学习的操作后使用层归一化,如LSTM和全连接操作。 |
leakyrelu |
漏漏校正线性单元(ReLU)激活操作执行非线性阈值操作,其中任何小于零的输入值都乘以一个固定的比例因子。 |
lstm |
长短期记忆(LSTM)操作允许网络学习时间序列和序列数据中时间步之间的长期依赖关系。 |
maxpool |
最大池操作通过将输入划分到池区域并计算每个区域的最大值来执行下采样。 |
maxunpool |
最大解池操作通过上采样和填充零来解池最大解池操作的输出。 |
均方误差 |
半均方误差运算计算回归任务中网络预测值与目标值之间的半均方误差损失。 |
onehotdecode |
单热解码操作将概率向量(如分类网络的输出)解码为分类标签。 输入 |
线性整流函数(Rectified Linear Unit) |
整流线性单元(ReLU)激活操作执行非线性阈值操作,其中任何小于零的输入值都被设置为零。 |
乙状结肠 |
sigmoid激活操作将sigmoid函数应用于输入数据。 |
softmax |
softmax激活操作将softmax函数应用于输入数据的通道维度。 |
指定的损失函数
当使用自定义训练循环时,必须在模型梯度函数中计算损失。在计算梯度更新网络权值时使用损失值。要计算损失,可以使用以下函数。
函数 | 描述 |
---|---|
softmax |
softmax激活操作将softmax函数应用于输入数据的通道维度。 |
乙状结肠 |
sigmoid激活操作将sigmoid函数应用于输入数据。 |
crossentropy |
交叉熵运算计算单标签和多标签分类任务中网络预测值与目标值之间的交叉熵损失。 |
l1loss |
L1损失运算计算L1损失给定网络预测和目标值。当减少 选择是“和” 和NormalizationFactor 选择是“批大小” ,其计算值称为平均绝对误差(MAE)。 |
l2loss |
L2损失运算计算L2损失(基于平方L2Norm)给出网络预测和目标值。当减少 选择是“和” 和NormalizationFactor 选择是“批大小” ,计算值称为均方误差(MSE)。 |
休伯 |
Huber运算计算回归任务的网络预测和目标值之间的Huber损失。当“TransitionPoint” 选项是1,这也被称为光滑的l1损失. |
均方误差 |
半均方误差运算计算回归任务中网络预测值与目标值之间的半均方误差损失。 |
ctc |
CTC操作计算未对齐序列之间的连接时态分类(CTC)损失。 |
或者,也可以通过创建表单的函数来使用自定义丢失函数损失= myLoss (Y, T)
,在那里Y
而且T
分别对应于网络预测和目标,和损失
是返回的损失。
有关如何训练生成对抗网络(GAN)的示例,该网络使用自定义损失函数生成图像,请参见训练生成对抗网络(GAN).
使用自动区分更新可学习参数
当你用自定义训练循环训练一个深度学习模型时,软件将可学习参数的损失最小化。为了使损耗最小化,该软件使用了损耗相对于可学习参数的梯度。要使用自动微分计算这些梯度,必须定义一个模型梯度函数。
定义模型损失函数
对于指定为的模型dlnetwork
对象,创建窗体的函数(损失,梯度)= modelLoss(净,X, T)
,在那里网
是网络,X
是网络输入,T
包含目标和损失
而且梯度
分别为返回损耗和梯度。您可以选择将额外的参数传递给梯度函数(例如,如果丢失函数需要额外的信息),或者返回额外的参数(例如,更新的网络状态)。
对于指定为函数的模型,请创建表单的函数(损失,梯度)= modelLoss(参数X, T)
,在那里参数
包含可学习参数,X
为模型输入,T
包含目标和损失
而且梯度
分别为返回损耗和梯度。您可以选择将额外的参数传递给梯度函数(例如,如果损失函数需要额外的信息),或者返回额外的参数(例如,更新的模型状态)。
要了解关于为自定义训练循环定义模型丢失函数的更多信息,请参见定义自定义训练循环的模型损失函数.
更新可学的参数
用自动微分法计算模型损失函数dlfeval
函数,该函数计算启用了自动微分的函数。对于的第一个输入dlfeval
,传递指定为函数句柄的模型丢失函数。对于以下输入,为模型损失函数传递所需的变量。的输出dlfeval
函数,指定与模型损失函数相同的输出。
要使用梯度更新可学习参数,可以使用以下函数。
函数 | 描述 |
---|---|
adamupdate |
使用自适应矩估计(Adam)更新参数 |
rmspropupdate |
使用均方根传播(RMSProp)更新参数 |
sgdmupdate |
使用带动量的随机梯度下降(SGDM)更新参数 |
dlupdate |
使用自定义函数更新参数 |
另请参阅
dlarray
|dlgradient
|dlfeval
|dlnetwork