定义自定义训练循环、损失函数和网络
对于大多数深度学习任务,您可以使用预训练网络,并使其适应您自己的数据。有关说明如何使用迁移学习来重新训练卷积神经网络以对新图像集进行分类的示例,请参阅训练深度学习网络以对新图像进行分类。您也可以通过对 layerGraph
对象使用 trainNetwork
和 trainingOptions
函数来从头创建和训练网络。
如果 trainingOptions
函数没有提供您的任务所需的训练选项,则您可以使用自动微分创建自定义训练循环。要了解详细信息,请参阅为自定义训练循环定义深度学习网络。
如果 Deep Learning Toolbox™ 没有提供任务所需的层(包括指定损失函数的输出层),则您可以创建自定义层。要了解详细信息,请参阅定义自定义深度学习层。对于无法使用输出层指定的损失函数,您可以在自定义训练循环中指定损失。要了解详细信息,请参阅指定损失函数。对于无法使用层图创建的网络,可以将自定义网络定义为函数。要了解详细信息,请参阅将网络定义为模型函数。
有关对哪项任务使用哪种训练方法的详细信息,请参阅Train Deep Learning Model in MATLAB。
为自定义训练循环定义深度学习网络
将网络定义为 dlnetwork
对象
对于大多数任务,您可以使用 trainingOptions
和 trainNetwork
函数来控制训练算法的细节。如果 trainingOptions
函数没有为您的任务提供所需的选项(例如,自定义学习率调度),则您可以使用 dlnetwork
对象定义您自己的自定义训练循环。dlnetwork
对象允许您使用自动微分来训练指定为层图的网络。
对于指定为层图的网络,您可以直接使用 dlnetwork
函数从层图创建 dlnetwork
对象。
net = dlnetwork(lgraph);
有关 dlnetwork
对象支持的层的列表,请参阅 dlnetwork
页的Supported Layers部分。有关如何使用自定义学习率调度来训练网络的示例,请参阅Train Network Using Custom Training Loop。
将网络定义为模型函数
对于无法使用层图创建的架构(例如,需要共享权重的 Siamese 网络),您可以将模型定义为 [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 函数应用于输入数据的通道维度。 |
指定损失函数
使用自定义训练循环时,必须在模型梯度函数中计算损失。计算梯度时使用损失值来更新网络权重。要计算损失,您可以使用以下函数。
函数 | 描述 |
---|---|
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) 损失。 |
您也可以通过创建 loss = myLoss(Y,T)
形式的函数来使用自定义损失函数,其中 Y
和 T
分别对应于网络预测和目标,loss
是返回的损失。
有关如何训练可通过自定义损失函数来生成图像的生成对抗网络 (GAN) 的示例,请参阅训练生成对抗网络 (GAN)。
使用自动微分更新可学习参数
当用自定义训练循环训练深度学习模型时,软件可最小化关于可学习参数的损失。为了最小化损失,软件使用损失关于可学习参数的梯度。要使用自动微分计算这些梯度,必须定义模型梯度函数。
定义模型损失函数
对于指定为 dlnetwork
对象的模型,创建 [loss,gradients] = modelLoss(net,X,T)
形式的函数,其中 net
是网络,X
是网络输入,T
包含目标,loss
和 gradients
分别是返回的损失和梯度。您也可以向梯度函数传递额外的参数(例如,当损失函数需要额外的信息时),或返回额外的参数(例如,已更新的网络状态)。
对于指定为函数的模型,创建 [loss,gradients] = modelLoss(parameters,X,T)
形式的函数,其中 parameters
包含可学习参数,X
是模型输入,T
包含目标,loss
和 gradients
分别是返回的损失和梯度。您也可以向梯度函数传递额外的参数(例如,当损失函数需要额外的信息时),或返回额外的参数(例如,已更新的模型状态)。
要了解有关为自定义训练循环定义模型损失函数的详细信息,请参阅Define Model Loss Function for Custom Training Loop。
更新可学习参数
要使用自动微分计算模型损失函数,请使用 dlfeval
函数,该函数可以对启用了自动微分的函数进行计算。对于 dlfeval
的第一个输入,传递指定为函数句柄的模型损失函数。对于以下输入,传递模型损失函数所需的变量。对于 dlfeval
函数的输出,指定与模型损失函数相同的输出。
要使用梯度更新可学习参数,您可以使用以下函数。
函数 | 描述 |
---|---|
adamupdate | 使用自适应矩估计 (Adam) 更新参数 |
rmspropupdate | 使用均方根传播 (RMSProp) 更新参数 |
sgdmupdate | 使用带动量的随机梯度下降 (SGDM) 更新参数 |
dlupdate | 使用自定义函数更新参数 |
另请参阅
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