主要内容

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

对于大多数深度学习任务,您可以使用预先训练的网络并将其适应于您自己的数据。有关如何使用迁移学习重新训练卷积神经网络来对一组新的图像进行分类的示例,请参见训练深度学习网络分类新图像.或者,您可以从头创建和训练网络使用layerGraph的对象trainNetworktrainingOptions功能。

如果trainingOptions函数没有提供您的任务所需的培训选项,那么您可以使用自动区分创建一个自定义培训循环。要了解更多,请查看定义自定义训练循环的深度学习网络

如果Deep Learning Toolbox™不提供任务所需的层(包括指定丢失函数的输出层),则可以创建自定义层。要了解更多,请查看定义自定义深度学习层.对于不能使用输出层指定的损耗函数,可以在自定义训练循环中指定损耗。要了解更多,请查看指定的损失函数.对于不能使用层图创建的网络,可以将自定义网络定义为一个函数。要了解更多,请查看定义网络为模型函数

有关对哪个任务使用哪个训练方法的更多信息,请参见在MATLAB中训练深度学习模型

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

网络定义为dlnetwork对象

对于大多数任务,您可以使用trainingOptionstrainNetwork功能。如果trainingOptions函数没有提供您的任务所需的选项(例如,自定义学习率计划),那么您可以使用dlnetwork对象。一个dlnetwork对象允许您使用自动区分来训练指定为层图的网络。

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

dlnet = dlnetwork (lgraph);

所支持的层列表金宝appdlnetwork对象,看到金宝app支持层部分的dlnetwork页面。有关如何使用自定义学习率计划训练网络的示例,请参见使用自定义训练循环的列车网络

定义网络为模型函数

对于不能使用层图创建的体系结构(例如,需要共享权重的Siamese网络),可以将模型定义为表单的函数[dlY1,…, dlYM] =模型(参数、dlX1…,dlXN),在那里参数包含网络参数,dlX1,…,dlXN的输入数据对应N模型的输入,dlY1,…,dlYM对应于模型输出。要训练定义为函数的深度学习模型,请使用定制的训练循环。例如,请参见使用模型函数的列车网络

当您将深度学习模型定义为一个函数时,您必须手动初始化层权值。有关更多信息,请参见初始化模型函数的可学习参数

如果您将自定义网络定义为一个函数,那么模型函数必须支持自动区分。金宝app您可以使用以下深度学习操作。这里列出的函数只是一个子集。获取支持的函数的完整列表金宝appdlarray输入,看到支持dlarray的函数列表金宝app

函数 描述
avgpool 平均池化操作通过将输入划分为池化区域并计算每个区域的平均值来执行降采样。
batchnorm 批处理归一化操作将每个通道的所有观测数据独立地归一化。为了加快卷积神经网络的训练速度,降低对网络初始化的敏感性,在卷积和非线性运算之间采用批归一化线性整流函数(Rectified Linear Unit)
crossentropy 交叉熵运算计算单标签和多标签分类任务的网络预测和目标值之间的交叉熵损失。
crosschannelnorm 跨通道规范化操作使用不同通道中的本地响应来规范化每个激活。跨通道标准化通常遵循线性整流函数(Rectified Linear Unit)操作。跨信道标准化也称为局部响应标准化。
ctc CTC操作计算未对齐序列之间的连接主义者时间分类(CTC)损失。
dlconv 卷积运算将滑动滤波器应用于输入数据。使用dlconv用于深度学习卷积、分组卷积和信道级可分离卷积的函数。
dltranspconv 转置卷积运算对特征映射进行上采样。
嵌入 嵌入操作将数值索引转换为数值向量,其中索引对应于离散数据。使用嵌入将离散数据(如分类值或单词)映射到数字向量。
fullyconnect 全连接操作将输入乘以一个权值矩阵,然后添加一个偏置向量。
groupnorm 分组归一化操作对每个观测的分组通道子集的输入数据进行独立归一化。为了加快卷积神经网络的训练速度,降低对网络初始化的敏感性,在卷积和非线性运算之间使用组归一化线性整流函数(Rectified Linear Unit)
格勒乌 门控循环单元(GRU)操作允许网络学习时间序列和序列数据的时间步长之间的依赖性。
休伯 Huber操作计算回归任务的网络预测和目标值之间的Huber损失。当“TransitionPoint”选项是1,这也叫做光滑的l1损失
instancenorm 实例规范化操作独立地对每个观测的每个通道的输入数据进行规范化。为了提高卷积神经网络训练的收敛性,降低对网络超参数的敏感性,在卷积和非线性运算之间采用实例归一化等方法线性整流函数(Rectified Linear Unit)
layernorm 层归一化操作独立地对每个观测的所有通道的输入数据进行归一化。为了加快递归和多层感知器神经网络的训练,降低对网络初始化的敏感性,可在LSTM等可学习操作后进行层归一化,完全连接操作。
leakyrelu 泄漏整流线性单元(ReLU)激活操作执行一个非线性阈值操作,其中任何小于零的输入值乘以一个固定的尺度因子。
lstm 长期短期记忆(LSTM)操作允许网络学习时间序列和序列数据时间步长之间的长期依赖关系。
maxpool 最大池化操作通过将输入划分为池化区域并计算每个区域的最大值来进行降采样。
maxunpool 最大反池操作通过上采样和填充0来反池最大池操作的输出。
均方误差 半均方误差运算计算回归任务的网络预测和目标值之间的半均方误差损失。
onehotdecode

一次热解码操作将概率向量(如分类网络的输出)解码为分类标签。

输入一个可以是一个dlarray.如果一个被格式化时,函数忽略数据格式。

线性整流函数(Rectified Linear Unit) 整流线性单元(ReLU)激活操作执行非线性阈值操作,其中任何小于零的输入值被设为零。
乙状结肠 sigmoid激活操作将sigmoid函数应用于输入数据。
softmax softmax激活操作将softmax函数应用于输入数据的通道维度。

指定的损失函数

当使用自定义训练循环时,必须在模型梯度函数中计算损失。在计算网络权值的梯度时使用loss值。您可以使用以下功能来计算损失。

函数 描述
softmax softmax激活操作将softmax函数应用于输入数据的通道维度。
乙状结肠 sigmoid激活操作将sigmoid函数应用于输入数据。
crossentropy 交叉熵运算计算单标签和多标签分类任务的网络预测和目标值之间的交叉熵损失。
休伯 Huber操作计算回归任务的网络预测和目标值之间的Huber损失。当“TransitionPoint”选项是1,这也叫做光滑的l1损失
均方误差 半均方误差运算计算回归任务的网络预测和目标值之间的半均方误差损失。
ctc CTC操作计算未对齐序列之间的连接主义者时间分类(CTC)损失。

或者,您可以通过创建表单的函数来使用自定义丢失函数损失= myLoss (Y, T),在那里YT分别对应网络预测和目标,和损失是退回的损失。

有关如何训练使用自定义损失函数生成图像的生成对抗网络(GAN)的示例,请参见训练生成对抗网络(GAN)

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

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

定义模型梯度函数

指定为dlnetwork对象,创建窗体的函数梯度= modelGradients (dlnet dlX T),在那里dlnet是网络,dlX是网络输入,T包含目标,和梯度包含返回的渐变。您可以选择将额外的参数传递给gradient函数(例如,如果loss函数需要额外的信息),或者返回额外的参数(例如,绘制训练进度的度量)。

对于指定为函数的模型,创建表单的函数梯度= modelGradients(参数、dlX T),在那里参数包含可学习参数,dlX是模型输入,T包含目标,和梯度包含返回的渐变。您可以选择将额外的参数传递给gradient函数(例如,如果loss函数需要额外的信息),或者返回额外的参数(例如,绘制训练进度的度量)。

要了解关于定义自定义训练循环的模型梯度函数的更多信息,请参见定义自定义训练循环的模型梯度函数

更新可学的参数

使用自动分化评估模型梯度,使用dlfeval函数,它计算启用了自动微分的函数。的第一个输入dlfeval,将模型梯度函数指定为函数句柄。对于以下输入,传递模型梯度函数所需的变量。的输出dlfeval函数,指定与模型梯度函数相同的输出。

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

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

另请参阅

|||

相关的话题