定义自定义训练循环、损失函数和网络
对于大多数深度学习任务,你可以使用预先训练好的网络,并使其适应你自己的数据。有关演示如何使用迁移学习重新训练卷积神经网络来对一组新图像进行分类的示例,请参见训练深度学习网络对新图像进行分类.或者,您可以从头创建和训练网络layerGraph
对象具有trainNetwork
而且trainingOptions
功能。
如果trainingOptions
函数没有为您的任务提供所需的训练选项,那么您可以使用自动区分创建自定义训练循环。要了解更多信息,请参见为自定义训练循环定义深度学习网络.
如果深度学习工具箱™不提供任务所需的层(包括指定损失函数的输出层),则可以创建自定义层。要了解更多信息,请参见定义自定义深度学习层.对于无法使用输出层指定的损失函数,可以在自定义训练循环中指定损失。要了解更多信息,请参见指定损失函数.对于不能使用层图创建的网络,可以将自定义网络定义为函数。要了解更多信息,请参见将网络定义为模型函数.
有关针对哪种任务使用哪种训练方法的更多信息,请参见用MATLAB训练深度学习模型.
为自定义训练循环定义深度学习网络
定义网络为dlnetwork
对象
控件控制训练算法的详细信息trainingOptions
而且trainNetwork
功能。如果trainingOptions
函数没有提供任务所需的选项(例如,自定义学习速率计划),则可以使用dlnetwork
对象。一个dlnetwork
对象允许您使用自动区分训练指定为层图的网络。
对于指定为层图的网络,可以创建dlnetwork
对象从层图中获取dlnetwork
直接函数。
Net = dlnetwork(lgraph);
控件支持的层列表万博1manbetxdlnetwork
对象,请参见万博1manbetx支持层部份dlnetwork
页面。有关显示如何使用自定义学习速率计划训练网络的示例,请参见使用自定义训练循环训练网络.
将网络定义为模型函数
对于不能使用层图创建的体系结构(例如,需要共享权重的Siamese网络),可以将模型定义为表单的函数(日元…,YM] =模型(参数,X1,…,XN)
,在那里参数
包含网络参数,X1,…,XN
类的输入数据对应N
模型输入,以及日元…,
对应于米
模型输出。要训练定义为函数的深度学习模型,请使用自定义训练循环。有关示例,请参见利用模型函数训练网络.
在将深度学习模型定义为函数时,必须手动初始化层权重。有关更多信息,请参见初始化模型函数的可学习参数.
如果将自定义网络定义为函数,则模型函数必须支持自动微分。万博1manbetx您可以使用以下深度学习操作。这里列出的函数只是一个子集。获取支持的函数的完整列表万博1manbetxdlarray
输入,看到支持dlarray的函数列表万博1manbetx.
函数 | 描述 |
---|---|
注意 |
注意操作使用加权乘法操作关注输入的部分。 |
avgpool |
平均池化操作通过将输入划分为池化区域并计算每个区域的平均值来执行下采样。 |
batchnorm |
批归一化操作对每个通道的所有观测数据分别进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感性,在卷积和非线性操作之间使用批量归一化,如线性整流函数(Rectified Linear Unit) . |
crossentropy |
交叉熵运算计算单标签和多标签分类任务中网络预测值和目标值之间的交叉熵损失。 |
crosschannelnorm |
跨通道归一化操作使用不同通道中的本地响应来归一化每个激活。跨渠道标准化通常遵循线性整流函数(Rectified Linear Unit) 操作。跨通道归一化也称为局部响应归一化。 |
ctc |
CTC操作计算未对齐序列之间的连接主义时间分类(CTC)损失。 |
dlconv |
卷积运算对输入数据应用滑动滤波器。使用dlconv 用于深度学习卷积、分组卷积和通道可分离卷积的函数。 |
dlode45 |
神经常微分方程(ODE)操作返回一个指定的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损失(基于L的平方2Norm)给出网络预测和目标值。当减少 选择是“和” 和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损失(基于L的平方2Norm)给出网络预测和目标值。当减少 选择是“和” 和NormalizationFactor 选择是“批大小” 时,计算出的值称为均方误差(MSE)。 |
休伯 |
Huber操作计算回归任务的网络预测和目标值之间的Huber损失。当“TransitionPoint” 选项是1,这也被称为光滑的l1损失. |
均方误差 |
半均方误差运算计算回归任务的网络预测值和目标值之间的半均方误差损失。 |
ctc |
CTC操作计算未对齐序列之间的连接主义时间分类(CTC)损失。 |
或者,您也可以通过创建表单函数来使用自定义损失函数损失= myLoss(Y,T)
,在那里Y
而且T
分别对应于网络预测和目标,和损失
是返回的损失。
有关演示如何训练生成式对抗网络(GAN)的示例,该网络使用自定义损失函数生成图像,请参见训练生成对抗网络(GAN).
使用自动区分更新可学习参数
当你用一个定制的训练循环训练一个深度学习模型时,软件会最小化关于可学习参数的损失。为了使损失最小化,该软件使用了损失相对于可学习参数的梯度。要使用自动微分来计算这些梯度,必须定义一个模型梯度函数。
定义模型损失函数
对于指定为的模型dlnetwork
对象,创建窗体的函数[loss,gradients] = modelLoss(net,X,T)
,在那里网
就是网络,X
是网络输入,T
包含目标和损失
而且梯度
分别为返回损失和梯度。可选地,您可以向gradients函数传递额外的参数(例如,如果损失函数需要额外的信息),或者返回额外的参数(例如,更新的网络状态)。
对于指定为函数的模型,请创建该形式的函数[loss,gradients] = modelLoss(parameters,X,T)
,在那里参数
包含可学习参数,X
为模型输入,T
包含目标和损失
而且梯度
分别为返回损失和梯度。可选地,您可以向gradients函数传递额外的参数(例如,如果损失函数需要额外的信息),或者返回额外的参数(例如,更新的模型状态)。
要了解有关为自定义训练循环定义模型损失函数的详细信息,请参见定义自定义训练循环的模型损失函数.
更新可学习参数
要使用自动微分来评估模型损失函数,请使用dlfeval
函数,它计算启用了自动区分的函数。的第一个输入dlfeval
,传递指定为函数句柄的模型损失函数。对于以下输入,传递模型损失函数所需的变量。的输出dlfeval
函数,指定与模型损失函数相同的输出。
要使用梯度更新可学习参数,可以使用以下函数。
函数 | 描述 |
---|---|
adamupdate |
使用自适应矩估计更新参数(Adam) |
rmspropupdate |
使用均方根传播(RMSProp)更新参数 |
sgdmupdate |
使用随机动量梯度下降(SGDM)更新参数 |
dlupdate |
使用自定义函数更新参数 |
另请参阅
dlarray
|dlgradient
|dlfeval
|dlnetwork