Main Content

本页翻译不是最新的。点击此处可查看最新英文版本。

定义自定义训练循环、损失函数和网络

对于大多数深度学习任务,您可以使用预训练神经网络,并使其适应您自己的数据。有关说明如何使用迁移学习来重新训练卷积神经网络以对新图像集进行分类的示例,请参阅训练深度学习网络以对新图像进行分类。您也可以使用 trainnettrainNetworktrainingOptions 函数来从头创建和训练神经网络。

如果 trainingOptions 函数没有提供您的任务所需的训练选项,则您可以使用自动微分创建自定义训练循环。要了解详细信息,请参阅为自定义训练循环定义深度学习网络

如果 Deep Learning Toolbox™ 没有提供任务所需的层(包括指定损失函数的输出层),则您可以创建自定义层。要了解详细信息,请参阅定义自定义深度学习层。对于无法使用输出层指定的损失函数,您可以在自定义训练循环中指定损失。要了解详细信息,请参阅指定损失函数。对于无法使用层图创建的网络,可以将自定义网络定义为函数。要了解详细信息,请参阅将网络定义为模型函数

有关对哪项任务使用哪种训练方法的详细信息,请参阅Train Deep Learning Model in MATLAB

为自定义训练循环定义深度学习网络

将网络定义为 dlnetwork 对象

对于大多数任务,您可以使用 trainingOptionstrainnettrainNetwork 函数来控制训练算法的细节。如果 trainingOptions 函数没有为您的任务提供所需的选项(例如,自定义学习率调度),则您可以使用 dlnetwork 对象定义您自己的自定义训练循环。dlnetwork 对象允许您使用自动微分来训练指定为层图的网络。

对于指定为层图的网络,您可以直接使用 dlnetwork 函数从层图创建 dlnetwork 对象。

net = dlnetwork(lgraph);

有关如何使用自定义学习率调度来训练网络的示例,请参阅Train Network Using Custom Training Loop

将网络定义为模型函数

对于无法使用层图创建的架构(例如,需要共享权重的孪生神经网络),您可以将模型定义为 [Y1,...,YM] = model(parameters,X1,...,XN) 形式的函数,其中 parameters 包含网络参数,X1,...,XN 对应于 N 个模型输入的输入数据,Y1,...,YM 对应于 M 个模型输出。要训练定义为函数的深度学习模型,请使用自定义训练循环。有关示例,请参阅Train Network Using Model Function

将深度学习模型定义为函数时,必须手动初始化层权重。有关详细信息,请参阅Initialize Learnable Parameters for Model Function

如果您将自定义网络定义为函数,则模型函数必须支持自动微分。您可以使用以下深度学习运算。此处列出的函数只是一部分。有关支持 dlarray 输入的函数的完整列表,请参阅List of Functions with dlarray Support

函数描述
attentionattention 运算专门使用加权乘法运算来处理输入部分。
avgpool平均池化运算通过将输入划分为若干池化区域并计算每个区域的平均值来执行下采样。
batchnorm批量归一化运算独立地对每个通道的所有观测值的输入数据进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感度,请在卷积和非线性运算之间使用批量归一化,如 relu
crossentropy交叉熵运算计算单标签和多标签分类任务的网络预测和目标值之间的交叉熵损失。
crosschannelnorm跨通道归一化运算使用不同通道中的局部响应来归一化每个激活。跨通道归一化通常遵循 relu 运算。跨通道归一化也称为局部响应归一化。
ctcCTC 运算计算未对齐序列之间的连接时序分类 (CTC) 损失。
dlconv卷积运算对输入数据应用滑动滤波器。使用 dlconv 函数进行深度学习卷积、分组卷积和按通道可分离卷积。
dlode45神经常微分方程 (ODE) 运算返回指定的 ODE 的解。
dltranspconv转置卷积运算对特征图进行上采样。
embed嵌入运算将数值索引转换为数值向量,其中索引对应于离散数据。使用嵌入将离散数据(如分类值或单词)映射到数值向量。
fullyconnect全连接运算将输入乘以权重矩阵,然后添加偏置向量。
gelu高斯误差线性单元 (GELU) 激活运算根据高斯分布下的概率对输入进行加权。
groupnorm组归一化运算独立地对每个观测的通道分组子集的输入数据进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感度,请在卷积和非线性运算之间使用组归一化,如 relu
gru门控循环单元 (GRU) 运算允许网络学习时间序列和序列数据中时间步之间的相关性。
huberHuber 运算计算回归任务的网络预测和目标值之间的 Huber 损失。当 'TransitionPoint' 选项为 1 时,这也称为平滑 L1 损失
instancenorm实例归一化运算独立地对每个观测的每个通道的输入数据进行归一化。为了改进训练卷积神经网络的收敛性并降低对网络超参数的敏感度,请在卷积和非线性运算之间使用实例归一化,如 relu
l1lossL1 损失运算计算在给定网络预测和目标值情况下的 L1 损失。当 Reduction 选项为 "sum"NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均值绝对误差 (MAE)。
l2lossL2 损失运算计算在给定网络预测和目标值情况下的 L2 损失(基于 L2 范数的平方)。当 Reduction 选项为 "sum"NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均方误差 (MSE)。
layernorm层归一化运算独立地对每个观测的所有通道的输入数据进行归一化。为了加快循环和多层感知器神经网络的训练并降低对网络初始化的敏感度,请在可学习运算后使用层归一化,例如 LSTM 和全连接运算。
leakyrelu泄漏修正线性单元 (ReLU) 激活运算执行非线性阈值运算,其中任何小于零的输入值都会乘以一个固定缩放因子。
lstm长短期记忆 (LSTM) 运算允许网络学习时间序列和序列数据中时间步之间的长期相关性。
maxpool最大池化运算通过将输入划分为若干池化区域并计算每个区域的最大值来执行下采样。
maxunpool最大去池化运算通过上采样和填充零对最大池化运算的输出进行去池化。
mse半均方误差运算计算回归任务的网络预测和目标值之间的半均方误差损失。
onehotdecode

one-hot 解码运算将概率向量(例如分类网络的输出)解码为分类标签。

输入 A 可以是 dlarray。如果 A 已格式化,函数将忽略数据格式。

relu修正线性单元 (ReLU) 激活运算执行非线性阈值运算,其中任何小于零的输入值都设置为零。
sigmoidsigmoid 激活运算将 sigmoid 函数应用于输入数据。
softmaxsoftmax 激活运算将 softmax 函数应用于输入数据的通道维度。

指定损失函数

使用自定义训练循环时,必须在模型梯度函数中计算损失。计算梯度时使用损失值来更新网络权重。要计算损失,您可以使用以下函数。

函数描述
softmaxsoftmax 激活运算将 softmax 函数应用于输入数据的通道维度。
sigmoidsigmoid 激活运算将 sigmoid 函数应用于输入数据。
crossentropy交叉熵运算计算单标签和多标签分类任务的网络预测和目标值之间的交叉熵损失。
l1lossL1 损失运算计算在给定网络预测和目标值情况下的 L1 损失。当 Reduction 选项为 "sum"NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均值绝对误差 (MAE)。
l2lossL2 损失运算计算在给定网络预测和目标值情况下的 L2 损失(基于 L2 范数的平方)。当 Reduction 选项为 "sum"NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均方误差 (MSE)。
huberHuber 运算计算回归任务的网络预测和目标值之间的 Huber 损失。当 'TransitionPoint' 选项为 1 时,这也称为平滑 L1 损失
mse半均方误差运算计算回归任务的网络预测和目标值之间的半均方误差损失。
ctcCTC 运算计算未对齐序列之间的连接时序分类 (CTC) 损失。

您也可以通过创建 loss = myLoss(Y,T) 形式的函数来使用自定义损失函数,其中 YT 分别对应于网络预测和目标,loss 是返回的损失。

有关如何训练可通过自定义损失函数来生成图像的生成对抗网络 (GAN) 的示例,请参阅训练生成对抗网络 (GAN)

使用自动微分更新可学习参数

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

定义模型损失函数

对于指定为 dlnetwork 对象的模型,创建 [loss,gradients] = modelLoss(net,X,T) 形式的函数,其中 net 是网络,X 是网络输入,T 包含目标,lossgradients 分别是返回的损失和梯度。您也可以向梯度函数传递额外的参数(例如,当损失函数需要额外的信息时),或返回额外的参数(例如,已更新的网络状态)。

对于指定为函数的模型,创建 [loss,gradients] = modelLoss(parameters,X,T) 形式的函数,其中 parameters 包含可学习参数,X 是模型输入,T 包含目标,lossgradients 分别是返回的损失和梯度。您也可以向梯度函数传递额外的参数(例如,当损失函数需要额外的信息时),或返回额外的参数(例如,已更新的模型状态)。

要了解有关为自定义训练循环定义模型损失函数的详细信息,请参阅Define Model Loss Function for Custom Training Loop

更新可学习参数

要使用自动微分计算模型损失函数,请使用 dlfeval 函数,该函数可以对启用了自动微分的函数进行计算。对于 dlfeval 的第一个输入,传递指定为函数句柄的模型损失函数。对于以下输入,传递模型损失函数所需的变量。对于 dlfeval 函数的输出,指定与模型损失函数相同的输出。

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

函数描述
adamupdate使用自适应矩估计 (Adam) 更新参数
rmspropupdate使用均方根传播 (RMSProp) 更新参数
sgdmupdate使用带动量的随机梯度下降 (SGDM) 更新参数
lbfgsupdate使用限制内存量的 BFGS (L-BFGS) 更新参数
dlupdate使用自定义函数更新参数

另请参阅

| | |

相关主题