对于大多数深度学习任务,您可以使用预先训练的网络并将其适应您自己的数据。有关显示如何使用转移学习来重新训练卷积神经网络以对一组新图像进行分类的示例,请参阅训练深度学习网络对新图像进行分类。或者,您可以使用layerGraph
带有trainNetwork
和trainingOptions
功能的对象从头开始创建和训练网络。
如果该trainingOptions
功能未提供任务所需的培训选项,则可以使用自动区分功能创建自定义培训循环。要了解更多信息,请参阅为自定义训练循环定义深度学习网络。
如果Deep Learning Toolbox™没有提供任务所需的层(包括指定损失函数的输出层),则可以创建自定义层。要了解更多信息,请参阅定义自定义深度学习层。对于无法使用输出层指定的损失函数,可以在自定义训练循环中指定损失。要了解更多信息,请参阅指定损耗函数。对于无法使用图层图创建的网络,可以将自定义网络定义为函数。要了解更多信息,请参阅将网络定义为模型函数。
有关针对哪种任务使用哪种训练方法的更多信息,请参见MATLAB中的训练深度学习模型。
为自定义训练循环定义深度学习网络
将网络定义为dlnetwork
对象
对于大多数任务,您可以使用trainingOptions
和trainNetwork
函数控制训练算法的详细信息。如果该trainingOptions
函数未提供任务所需的选项(例如,自定义学习率计划),则可以使用一个dlnetwork
对象定义自己的自定义训练循环。甲dlnetwork
对象可以训练指定为使用自动微分的层图形的网络。
对于指定为图层图的网络,可以直接dlnetwork
使用该dlnetwork
功能从图层图创建 对象 。有关dlnetwork
对象支持的图层的列表 ,请参见dlnetwork
页面的“支持的图层”部分 。
dlnet = dlnetwork(lgraph);
将网络定义为模型函数
对于无法使用层图创建的架构(例如,需要共享权重的暹罗网络),您可以将模型定义为的函数,形式为[dlY1,...,dlYM] = model(parameters,dlX1,...,dlXN)
,其中parameters
包含网络参数,dlX1,...,dlXN
与N
模型输入的输入数据相对应,并 dlY1,...,dlYM
对应于M
模型输出。要训练定义为功能的深度学习模型,请使用自定义训练循环。有关示例,请参见使用模型函数训练网络。
将深度学习模型定义为函数时,必须手动初始化图层权重。有关更多信息,请参见初始化模型函数的可学习参数。
如果将自定义网络定义为功能,则模型功能必须支持自动区分。您可以使用以下深度学习操作。此处列出的功能仅是一个子集。有关支持dlarray
输入的功能的完整列表,请参见dlarray Support的功能列表。
功能 | 描述 |
---|---|
avgpool |
平均池操作通过将输入划分为池区域并计算每个区域的平均值来执行下采样。 |
batchnorm |
批处理规范化操作可跨迷你批处理规范化每个输入通道。为了加快卷积神经网络的训练速度并降低对网络初始化的敏感度,请在卷积和非线性运算(例如)之间使用批量归一化relu 。 |
crossentropy |
交叉熵操作计算单标签和多标签分类任务的网络预测与目标值之间的交叉熵损失。 |
crosschannelnorm |
跨通道标准化操作使用不同通道中的本地响应来标准化每次激活。跨通道归一化通常在relu 操作之后进行。跨通道归一化也称为本地响应归一化。 |
dlconv |
卷积运算将滑动滤波器应用于输入数据。使用具有未分组卷积或分组卷积的一维和二维滤波器以及具有未分组卷积的3-D滤波器。 |
dltranspconv |
转置的卷积运算对特征图进行升采样。 |
embed |
embed操作将数字索引转换为数字向量,其中索引对应于离散数据。使用嵌入将离散数据(例如分类值或单词)映射到数字向量。 |
fullyconnect |
完全连接操作将输入乘以权重矩阵,然后添加一个偏差矢量。 |
groupnorm |
组归一化操作将输入数据的通道划分为组,并对每个组中的激活进行归一化。为了加快卷积神经网络的训练速度并降低对网络初始化的敏感性,请在卷积和非线性运算(例如)之间使用组归一化relu 。您可以通过设置适当的组数来执行实例规范化和层规范化。 |
gru |
门控循环单元(GRU)操作允许网络学习时间序列中的时间步长与序列数据之间的依存关系。 |
leakyrelu |
泄漏整流线性单元(ReLU)激活操作执行非线性阈值操作,其中任何小于零的输入值都将乘以固定比例因子。 |
lstm |
长短期记忆(LSTM)操作允许网络学习时间序列中的时间步长与序列数据之间的长期依赖性。 |
maxpool |
最大池操作通过将输入划分为池区域并计算每个区域的最大值来执行下采样。 |
maxunpool |
最大解池操作通过对零进行上采样和填充来解池最大池化操作的输出。 |
mse |
半均方误差操作计算网络预测与回归任务目标值之间的半均方误差损失。 |
relu |
整流线性单元(ReLU)激活操作执行非线性阈值操作,其中任何小于零的输入值都将设置为零。 |
onehotdecode |
单次热解码操作将概率向量(例如分类网络的输出)解码为分类标签。 输入 A 可以是dlarray 。如果 A 已格式化,则该函数将忽略数据格式。 |
sigmoid |
S形激活操作将S形函数应用于输入数据。 |
softmax |
softmax激活操作将softmax功能应用于输入数据的通道尺寸。 |
指定损失函数
使用自定义训练循环时,必须在模型梯度函数中计算损耗。在计算用于更新网络权重的梯度时,请使用损耗值。要计算损失,可以使用以下函数:
功能 | 描述 |
---|---|
softmax |
softmax激活操作将softmax功能应用于输入数据的通道尺寸。 |
sigmoid |
S形激活操作将S形函数应用于输入数据。 |
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
包含返回的梯度。(可选)您可以将额外的参数传递给渐变函数(例如,如果损失函数需要额外的信息),或者返回额外的参数(例如,用于绘制训练进度的指标)。
要了解有关为自定义训练循环定义模型梯度函数的更多信息,请参阅为自定义训练循环定义模型梯度函数。
更新可学习的参数
要使用自动微分来评估模型梯度,请使用 dlfeval
评估启用了自动微分的函数的函数。对于的第一个输入dlfeval
,传递指定为函数句柄的模型梯度函数,对于以下输入,传递模型梯度函数所需的变量。对于dlfeval
函数的输出 ,请指定与模型梯度函数相同的输出。
要使用梯度更新可学习的参数,可以使用以下功能:
功能 | 描述 |
---|---|
adamupdate |
使用自适应力矩估计(Adam)更新参数 |
rmspropupdate |
使用均方根传播(RMSProp)更新参数 |
sgdmupdate |
使用具有动量的随机梯度下降(SGDM)更新参数 |
dlupdate |
使用自定义功能更新参数 |