定义自定义训练循环、损失函数和网络
对于大多数深度学习任务,您可以使用预训练神经网络,并使其适应您自己的数据。有关说明如何使用迁移学习来重新训练卷积神经网络以对一组新图像进行分类的示例,请参阅Retrain Neural Network to Classify New Images。您也可以使用 trainnet
和 trainingOptions
函数从头创建和训练神经网络。
如果 trainingOptions
函数没有提供您的任务所需的训练选项,则您可以使用自动微分创建自定义训练循环。要了解详细信息,请参阅Train Network Using Custom Training Loop。
如果 trainnet
函数没有提供您的任务所需的损失函数,您可以将 trainnet
的自定义损失函数指定为函数句柄。对于需要比预测值和目标值更多输入的损失函数(例如,需要访问神经网络或额外输入的损失函数),请使用自定义训练循环来训练模型。要了解详细信息,请参阅Train Network Using Custom Training Loop。
如果 Deep Learning Toolbox™ 没有提供您的任务所需的层,则您可以创建一个自定义层。要了解详细信息,请参阅定义自定义深度学习层。对于无法指定为由层组成的网络的模型,可以将模型定义为函数。要了解详细信息,请参阅Train Network Using Model Function。
有关对哪项任务使用哪种训练方法的详细信息,请参阅Train Deep Learning Model in MATLAB。
定义自定义损失函数
trainnet
函数提供了多个用于训练的内置损失函数。例如,您可以通过将 "crossentropy"
和 "mse"
分别指定为损失函数参量,以指定分类的交叉熵损失和回归的均方误差损失。
如果 trainnet
函数没有提供您的任务所需的损失函数,您可以将 trainnet
的自定义损失函数指定为函数句柄。该函数必须具有语法 loss = f(Y,T)
,其中 Y
和 T
分别是预测值和目标值。
为了帮助创建自定义损失函数,您可以使用下表中的深度学习函数。您还可以将这些函数作为函数句柄直接传递给 trainnet
函数。
函数 | 描述 |
---|---|
softmax | softmax 激活运算将 softmax 函数应用于输入数据的通道维度。 |
sigmoid | sigmoid 激活运算将 sigmoid 函数应用于输入数据。 |
crossentropy | 交叉熵运算计算单标签和多标签分类任务的网络预测值和目标值之间的交叉熵损失。 |
l1loss | L1 损失运算计算在给定网络预测值和目标值情况下的 L1 损失。当 Reduction 选项为 "sum" 且 NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均值绝对误差 (MAE)。 |
l2loss | L2 损失运算计算在给定网络预测值和目标值情况下的 L2 损失(基于 L2 范数的平方)。当 Reduction 选项为 "sum" 且 NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均方误差 (MSE)。 |
huber | Huber 运算计算回归任务的网络预测值和目标值之间的 Huber 损失。当 'TransitionPoint' 选项为 1 时,这也称为平滑 L1 损失。 |
mse | 半均方误差运算计算回归任务的网络预测值和目标值之间的半均方误差损失。 |
ctc | CTC 运算计算未对齐序列之间的连接时序分类 (CTC) 损失。 |
对于需要比预测值和目标值更多输入的损失函数(例如,需要访问神经网络或额外输入的损失函数),请使用自定义训练循环来训练模型。有关详细信息,请参阅定义自定义训练循环损失函数。有关示例,请参阅Train Network Using Custom Training Loop。
为自定义训练循环定义深度学习模型
对于大多数任务,您可以使用 trainingOptions
和 trainnet
函数来控制训练算法的细节。如果 trainingOptions
函数没有为您的任务提供所需的选项(例如,自定义学习率调度),则您可以定义您自己的自定义训练循环。
将模型定义为神经网络
对于可以指定为层数组或层神经网络的模型,请将模型指定为 dlnetwork
对象。例如,要为自定义训练循环定义简单的 LSTM 神经网络,请使用:
layers = [
sequenceInputLayer(3)
lstmLayer(100,OutputMode="last")
fullyConnectedLayer(4)
softmaxLayer];
net = dlnetwork(layers);
要使用自定义训练循环来训练神经网络,必须初始化网络。要初始化神经网络,请使用 initialize
函数。
net = initialize(net);
有关如何使用自定义学习率调度来训练网络的示例,请参阅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。
函数 | 描述 |
---|---|
attention | attention 运算专门使用加权乘法运算来处理输入部分。 |
avgpool | 平均池化运算通过将输入划分为若干池化区域并计算每个区域的平均值来执行下采样。 |
batchnorm | 批量归一化运算独立地对每个通道的所有观测值的输入数据进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感度,请在卷积和非线性运算之间使用批量归一化,如 relu 。 |
crossentropy | 交叉熵运算计算单标签和多标签分类任务的网络预测值和目标值之间的交叉熵损失。 |
crosschannelnorm | 跨通道归一化运算使用不同通道中的局部响应来归一化每个激活。跨通道归一化通常遵循 relu 运算。跨通道归一化也称为局部响应归一化。 |
ctc | CTC 运算计算未对齐序列之间的连接时序分类 (CTC) 损失。 |
dlconv | 卷积运算对输入数据应用滑动滤波器。使用 dlconv 函数进行深度学习卷积、分组卷积和按通道可分离卷积。 |
dlode45 | 神经常微分方程 (ODE) 运算返回指定的 ODE 的解。 |
dltranspconv | 转置卷积运算对特征图进行上采样。 |
embed | 嵌入运算将数值索引转换为数值向量,其中索引对应于离散数据。使用嵌入将离散数据(如分类值或单词)映射到数值向量。 |
fullyconnect | 全连接运算将输入乘以权重矩阵,然后添加偏置向量。 |
gelu | 高斯误差线性单元 (GELU) 激活运算根据高斯分布下的概率对输入进行加权。 |
groupnorm | 组归一化运算独立地对每个观测的通道分组子集的输入数据进行归一化。为了加快卷积神经网络的训练并降低对网络初始化的敏感度,请在卷积和非线性运算之间使用组归一化,如 relu 。 |
gru | 门控循环单元 (GRU) 运算允许网络学习时间序列和序列数据中时间步之间的相关性。 |
huber | Huber 运算计算回归任务的网络预测值和目标值之间的 Huber 损失。当 'TransitionPoint' 选项为 1 时,这也称为平滑 L1 损失。 |
instancenorm | 实例归一化运算独立地对每个观测的每个通道的输入数据进行归一化。为了改进训练卷积神经网络的收敛性并降低对网络超参数的敏感度,请在卷积和非线性运算之间使用实例归一化,如 relu 。 |
l1loss | L1 损失运算计算在给定网络预测值和目标值情况下的 L1 损失。当 Reduction 选项为 "sum" 且 NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均值绝对误差 (MAE)。 |
l2loss | L2 损失运算计算在给定网络预测值和目标值情况下的 L2 损失(基于 L2 范数的平方)。当 Reduction 选项为 "sum" 且 NormalizationFactor 选项为 "batch-size" 时,计算出的值称为均方误差 (MSE)。 |
layernorm | 层归一化运算独立地对每个观测的所有通道的输入数据进行归一化。为了加快循环和多层感知器神经网络的训练并降低对网络初始化的敏感度,请在可学习运算后使用层归一化,例如 LSTM 和全连接运算。 |
leakyrelu | 泄漏修正线性单元 (ReLU) 激活运算执行非线性阈值运算,其中任何小于零的输入值都会乘以一个固定缩放因子。 |
lstm | 长短期记忆 (LSTM) 运算允许网络学习时间序列和序列数据中时间步之间的长期相关性。 |
maxpool | 最大池化运算通过将输入划分为若干池化区域并计算每个区域的最大值来执行下采样。 |
maxunpool | 最大去池化运算通过上采样和填充零对最大池化运算的输出进行去池化。 |
mse | 半均方误差运算计算回归任务的网络预测值和目标值之间的半均方误差损失。 |
onehotdecode | one-hot 解码运算将概率向量(例如分类网络的输出)解码为分类标签。 输入 |
relu | 修正线性单元 (ReLU) 激活运算执行非线性阈值运算,其中任何小于零的输入值都设置为零。 |
sigmoid | sigmoid 激活运算将 sigmoid 函数应用于输入数据。 |
softmax | softmax 激活运算将 softmax 函数应用于输入数据的通道维度。 |
定义自定义训练循环损失函数
训练深度神经模型是一项优化任务。通过将深度学习模型视为函数 f(X;θ)(其中 X 是模型输入,而 θ 是可学习参数集),您可以优化 θ,以便根据训练数据最小化某些损失值。例如,优化可学习参数 θ,以便对于给定的输入 X 和对应的目标值 T,它们可以最小化预测值 Y=f(X;θ) 和 T 之间的误差。
要使用自定义训练循环来训练深度学习模型,可以使用基于梯度下降的方法来最小化损失。例如,您可以迭代方式更新模型的可学习参数以使损失最小化。例如,您可以使用 lbfgsupdate
、adamupdate
、rmspropupdate
和 sgdmupdate
函数更新可学习参数,这些函数需要可学习参数关于损失的梯度。要计算这些梯度,您可以使用自动微分。创建一个自定义损失函数,该函数接受模型和训练数据,并返回损失和损失关于可学习参数的梯度。
对于指定为 dlnetwork
对象的模型,创建 [loss,gradients] = modelLoss(net,X,T)
形式的函数,其中 net
是网络,X
是网络输入,T
包含目标,loss
和 gradients
分别是返回的损失和梯度。您也可以向梯度函数传递额外的参量(例如,当损失函数需要额外的信息时),或返回额外的参量(例如,已更新的网络状态)。
对于指定为函数的模型,创建 [loss,gradients] = modelLoss(parameters,X,T)
形式的函数,其中 parameters
包含可学习参数,X
是模型输入,T
包含目标,loss
和 gradients
分别是返回的损失和梯度。您也可以向梯度函数传递额外的参量(例如,当损失函数需要额外的信息时),或返回额外的参量(例如,已更新的模型状态)。
要计算 modelLoss
函数中的梯度,请使用 dlgradient
函数。
要了解有关为自定义训练循环定义模型损失函数的详细信息,请参阅Define Model Loss Function for Custom Training Loop。
有关如何训练可通过自定义损失函数来生成图像的生成对抗网络 (GAN) 的示例,请参阅训练生成对抗网络 (GAN)。
使用自动微分更新可学习参数
要使用自动微分计算模型损失函数,请使用 dlfeval
函数,该函数可以对启用了自动微分的函数进行计算。对于 dlfeval
的第一个输入,传递指定为函数句柄的模型损失函数。对于以下输入,传递模型损失函数所需的变量。对于 dlfeval
函数的输出,指定与模型损失函数相同的输出。
要更新可学习参数,您可以使用以下函数。
函数 | 描述 |
---|---|
adamupdate | 使用自适应矩估计 (Adam) 更新参数 |
rmspropupdate | 使用均方根传播 (RMSProp) 更新参数 |
sgdmupdate | 使用带动量的随机梯度下降 (SGDM) 更新参数 |
lbfgsupdate | 使用限制内存量的 BFGS (L-BFGS) 更新参数 |
dlupdate | 使用自定义函数更新参数 |
例如,要使用 SGDM 更新可学习参数,请在自定义训练循环的每次迭代中使用:
[loss,gradients] = dlfeval(@modelLoss,net,X,T); [net,velocity] = sgdmupdate(net,gradients,velocity,learnRate,momentum);
另请参阅
dlarray
| dlgradient
| dlfeval
| dlnetwork
相关主题
- 训练生成对抗网络 (GAN)
- Train Network Using Custom Training Loop
- Specify Training Options in Custom Training Loop
- Define Model Loss Function for Custom Training Loop
- Update Batch Normalization Statistics in Custom Training Loop
- Update Batch Normalization Statistics Using Model Function
- Make Predictions Using dlnetwork Object
- Make Predictions Using Model Function
- Train Network Using Model Function
- Initialize Learnable Parameters for Model Function
- Train Deep Learning Model in MATLAB
- 定义自定义深度学习层
- List of Functions with dlarray Support
- Automatic Differentiation Background
- Use Automatic Differentiation In Deep Learning Toolbox