Main Content

本页的翻译已过时。点击此处可查看最新英文版本。

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

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

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

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

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

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

将网络定义为 dlnetwork 对象

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

对于指定为层次图的网络,您可以直接使用 dlnetwork 函数从层次图创建 dlnetwork 对象。有关 dlnetwork 对象支持的层的列表,请参阅 dlnetwork 页的Supported Layers部分。

dlnet = dlnetwork(lgraph);

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

将网络定义为模型函数

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

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

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

函数说明
avgpool平均池化运算通过将输入划分为若干池化区域并计算每个区域的平均值来执行下采样。
batchnorm批量归一化运算对一个小批量中的每个输入通道进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感度,请在卷积和非线性运算之间使用批量归一化,如 relu
crossentropy交叉熵运算计算单标签和多标签分类任务的网络预测和目标值之间的交叉熵损失。
crosschannelnorm跨通道归一化运算使用不同通道中的局部响应来归一化每次激活。跨通道归一化通常遵循 relu 运算。跨通道归一化也称为局部响应归一化。
dlconv卷积运算对输入数据应用滑动滤波器。使用具有未分组或分组卷积的一维和二维滤波器,以及具有未分组卷积的三维滤波器。
dltranspconv转置卷积运算对特征图进行上采样。
embed嵌入运算将数值索引转换为数值向量,其中索引对应于离散数据。使用嵌入将离散数据(如分类值或单词)映射到数值向量。
fullyconnect全连接运算将输入乘以权重矩阵,然后添加偏置向量。
groupnorm组归一化运算将输入数据的通道划分为若干组,并对每组中的激活进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感度,请在卷积和非线性运算之间使用组归一化,如 relu。通过设置适当的组数,可以执行实例归一化和层归一化。
gru门控循环单元 (GRU) 运算允许网络学习时序和序列数据中时间步之间的相关性。
leakyrelu泄漏修正线性单元 (ReLU) 激活运算执行非线性阈值运算,其中任何小于零的输入值都会乘以一个固定缩放因子。
lstm长短期记忆 (LSTM) 运算允许网络学习时序和序列数据中时间步之间的长期相关性。
maxpool最大池化运算通过将输入划分为若干池化区域并计算每个区域的最大值来执行下采样。
maxunpool最大去池化运算通过上采样和填充零对最大池化运算的输出进行去池化。
mse半均方误差运算计算回归任务的网络预测和目标值之间的半均方误差损失。
relu修正线性单元 (ReLU) 激活运算执行非线性阈值运算,其中任何小于零的输入值都设置为零。
onehotdecode

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

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

sigmoidsigmoid 激活运算将 sigmoid 函数应用于输入数据。
softmaxsoftmax 激活运算将 softmax 函数应用于输入数据的通道维度。

指定损失函数

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

函数说明
softmaxsoftmax 激活运算将 softmax 函数应用于输入数据的通道维度。
sigmoidsigmoid 激活运算将 sigmoid 函数应用于输入数据。
crossentropy交叉熵运算计算单标签和多标签分类任务的网络预测和目标值之间的交叉熵损失。
mse半均方误差运算计算回归任务的网络预测和目标值之间的半均方误差损失。

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

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

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

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

定义模型梯度函数

对于指定为 dlnetwork 对象的模型,创建 gradients = modelGradients(dlnet,dlX,T) 形式的函数,其中 dlnet 是网络,dlX 包含输入预测变量,T 包含目标,gradients 包含返回的梯度。您也可以向梯度函数传递额外的参数(例如,当损失函数需要额外的信息时),或返回额外的参数(例如,用于绘制训练进度的指标)。

对于指定为函数的模型,创建 gradients = modelGradients(parameters,dlX,T) 形式的函数,其中 parameters 包含可学习参数,dlX 包含输入预测变量,T 包含目标,gradients 包含返回的梯度。您也可以向梯度函数传递额外的参数(例如,当损失函数需要额外的信息时),或返回额外的参数(例如,用于绘制训练进度的指标)。

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

更新可学习参数

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

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

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

另请参阅

| | |

相关主题