0
点赞
收藏
分享

微信扫一扫

深度学习 | MATLAB Deep Learning Toolbox trainingOptions 参数设定


深度学习 | MATLAB Deep Learning Toolbox trainingOptions 设定训练参数

trainingOptions运行环境

MATLAB Deep Learning Toolbox是深度学习工具箱,可以构建LSTM(长短期记忆神经网络)、GRU(门控循环单元)、CNN(卷积神经网络)。
实验测试表明MATLAB2020是目前该工具箱较为完善的版本,一般函数运行不会出现报错情况,2018会出现部分函数报错情况,2019笔者未曾测试。
本文主要介绍该工具箱用于构建深度神经网络的trainingOptions参数设置。

trainingOptions参数设定

trainingOptions设置总体情况

options = trainingOptions(solverName,Name,Value)
solverName——表示求解算法,如adam,sgdm等;
Name——表示各类参数名称;
Value——表示对应参数设置数值或类型;

trainingOptions简单举例

options = trainingOptions(
%使用带有动量的随机梯度下降训练算法
'sgdm', ...
'LearnRateSchedule','piecewise', ...
%每 5 个 epoch 将学习率降低 0.2 倍。
'LearnRateDropFactor',0.2, ...
'LearnRateDropPeriod',5, ...
%训练的最大 epoch 数设置为 20
'MaxEpochs',20, ...
%每次迭代中批量处理64 个观测值
'MiniBatchSize',64, ...
%打开训练进度图
'Plots','training-progress')

trainingOptions一些默认参数的取值或类型

options = 
TrainingOptionsSGDM with properties:

Momentum: 0.9000
InitialLearnRate: 0.0100
LearnRateSchedule: 'piecewise'
LearnRateDropFactor: 0.2000
LearnRateDropPeriod: 5
L2Regularization: 1.0000e-04
GradientThresholdMethod: 'l2norm'
GradientThreshold: Inf
MaxEpochs: 20
MiniBatchSize: 64
Verbose: 1
VerboseFrequency: 50
ValidationData: []
ValidationFrequency: 50
ValidationPatience: Inf
Shuffle: 'once'
CheckpointPath: ''
ExecutionEnvironment: 'auto'
WorkerLoad: []
OutputFcn: []
Plots: 'training-progress'
SequenceLength: 'longest'
SequencePaddingValue: 0
SequencePaddingDirection: 'right'
DispatchInBackground: 0
ResetInputNormalization: 1
BatchNormalizationStatistics: 'population'

监控深度学习训练进度

当为深度学习训练网络时,监控训练进度通常很有用。 通过在训练期间绘制各种指标,可以了解训练的进展情况。 例如,可以确定网络准确性是否提高以及提高的速度有多快,以及网络是否开始过度拟合训练数据。
当在 trainingOptions 中将 ‘training-progress’ 指定为 ‘Plots’ 值并开始网络训练时,trainNetwork 会创建一个图窗并在每次迭代时显示训练指标。 每次迭代都是梯度的估计和网络参数的更新。 如果在 trainingOptions 中指定验证数据,则该图显示每次 trainNetwork 验证网络时的验证指标。

分类任务

  • Training accuracy — 训练集批处理分类准确率;
  • Smoothed training accuracy — 训练平滑处理,降噪,趋势可达性高;
  • Validation accuracy — 验证集分类准确率;
  • Training loss, smoothed training loss, and validation loss — 每个小批量的损失,其平滑,以及验证集的损失。 如果网络的最后一层是分类层,那么损失函数就是交叉熵损失。

回归任务

  • 对于回归网络,使用了均方根误差 (RMSE) 而不是accuracy;
  • 阴影背景标记每个训练。一个 epoch 是对整个数据集的一次完整遍历;
  • 在训练过程中,可以通过单击右上角的停止按钮停止训练并返回网络的当前状态。例如,在网络的准确度达到平稳状态时停止训练,并且很明显准确度不再提高。单击停止按钮后,可能需要一段时间才能完成训练。训练完成后,trainNetwork 返回训练后的网络。
  • 训练完成后,查看显示最终验证准确率和训练完成原因的结果。最终验证指标在图中标记为 Final。如果网络包含批处理规范化层,那么最终的验证指标可能会与培训期间评估的验证指标有所不同。这是因为训练完成后用于批量归一化的均值和方差统计量可能不同。
  • 例如,如果 ‘BatchNormalizationStatisics’ 训练选项是 ‘population’,那么在训练之后,软件通过再次传递训练数据并使用结果均值和方差来最终确定批归一化统计数据。如果“BatchNormalizationStatisics”训练选项为“moving”,则软件会在训练期间使用运行估计来近似统计数据,并使用最新的统计数据值。

trainingOptions详细设定

solverName设定

solverName — 训练网络求解算法;
'sgdm' — 使用具有动量的随机梯度下降(SGDM)优化器。
可以使用 'Momentum' 名称-值对组参数指定动量值。
'rmsprop'— 使用 RMSProp 优化器。
可以使用 'SquaredGradientDecayFactor' 名称-值
指定组参数平方梯度移动平均值的衰减率。
'adam'— 使用 Adam 优化器。
可以分别使用 'GradientDecayFactor' 和
'SquaredGradientDecayFactor' 名称-值
指定组参数梯度和平方梯度移动平均值的衰减率。

Name-Value设定

指定可选的以逗号分隔的 Name,Value 参数对。 Name 是参数名称,Value 是对应的值。 名称必须出现在引号内。 可以按任意顺序指定多个名称和值对参数,如 Name1,Value1,…,NameN,ValueN。

  • 示例

'InitialLearnRate',0.03
——将初始学习率指定为 0.03
'L2Regularization',0.0005
——L2 正则化因子为 0.0005
'LearnRateSchedule','piecewise'
——指示软件在每个给定的 epoch 数中降低学习率乘以某个因子。

Plots and Display
  • ‘Plots’ — 在网络训练期间显示的图

在网络训练期间显示的图,指定为逗号分隔的对,由 'Plots' 和以下项之一组成:
'无'-训练期间不显示图。
'training-progress' - 绘制训练进度。
该图显示了小批量损失和准确性、验证损失和准确性以及有关训练进度的其他信息。
该图在右上角有一个停止按钮。 单击按钮停止训练并返回网络的当前状态。
示例:'Plots','training-progress'

  • ‘Verbose’ - 显示训练进度信息的指示器

在命令窗口中显示训练进度信息的指示器,
指定为逗号分隔的对,由“Verbose”和 1(真)或 0(假)组成。
详细输出显示分类/回归信息。

  • 分类信息
  • 回归信息
  • ‘VerboseFrequency’ - 详细打印的频率

详细打印频率,即打印到命令窗口之间的迭代次数,指定为逗号分隔的对,
由 'VerboseFrequency' 和一个正整数组成。
此选项仅在 'Verbose' 值等于 true 时有效。
如果您在训练期间验证网络,则 trainNetwork 还会在每次验证发生时打印到命令窗口。
示例:'VerboseFrequency',100

Mini-Batch Options
  • ‘MaxEpochs’ - Options -最大迭代次数

用于训练的最大次数,指定为逗号分隔的对,
由 'MaxEpochs' 和一个正整数组成。
迭代是梯度下降算法中朝着使用小批量最小化损失函数迈出的一步。
一个 epoch 是训练算法在整个训练集上的完整传递。
示例: 'MaxEpochs',400

  • ‘MiniBatchSize’ - 批量的大小

用于每次训练迭代的小批量大小,指定为逗号分隔的对,
由 'MiniBatchSize' 和一个正整数组成。
小批量是训练集的子集,用于评估损失函数的梯度并更新权重。
示例:'MiniBatchSize',50

  • ‘Shuffle’ - 数据改组的选项

数据混排的选项,指定为逗号分隔的一对,
由“随机”和以下内容之一组成:

'once' - 在训练前将训练和验证数据混洗一次。

'never' - 不打乱数据。

'every-epoch' - 在每个训练 epoch 之前打乱训练数据,
并在每次网络验证之前打乱验证数据。
如果 mini-batch 大小没有平均划分训练样本的数量,
则 trainNetwork 会丢弃不适合每个 epoch 的最终完整
mini-batch 的训练数据。
为避免每个时期都丢弃相同的数据,
请将“Shuffle”值设置为“every-epoch”。
示例:'Shuffle','every-epoch'

Validation
  • ‘ValidationData’ - 训练期间用于验证的数据

训练期间用于验证的数据,
指定为包含验证预测变量和响应的数据存储、表或元胞数组。
可以使用 trainNetwork 函数支持的相同格式指定验证预测变量和响应。
可以将验证数据指定为
数据存储、表或元胞数组 {predictors,responses},
其中预测变量包含验证预测变量,响应包含验证响应。

在训练期间,trainNetwork 计算验证数据的验证准确率和验证损失。
要指定验证频率,请使用 'ValidationFrequency' 名称-值对组参数。
还可以使用验证数据在验证损失停止减少时自动停止训练。
要打开自动验证停止,请使用 'ValidationPatience' 名称-值对组参数。

如果网络具有在预测期间与训练期间表现不同的层(例如,dropout 层),
则验证准确度可能高于训练(小批量)准确度。

验证数据会根据“Shuffle”值进行随机排列。
如果“Shuffle”值等于“every-epoch”,
则在每次网络验证之前对验证数据进行排列。

  • ‘ValidationFrequency’-网络验证的频率

以迭代次数表示的网络验证频率,指定为逗号分隔的对组,
由 'ValidationFrequency' 和一个正整数组成。

'ValidationFrequency' 值是验证指标评估之间的迭代次数。
要指定验证数据,请使用 'ValidationData' 名称-值对组参数。

示例:'ValidationFrequency',20

  • ‘ValidationPatience’ - 验证停止的限度

网络训练验证停止的限度,指定为逗号分隔的对,
由 'ValidationPatience' 和一个正整数或 Inf 组成。

'ValidationPatience' 值是在网络训练停止之前验证集上的损失可以大于或等于先前最小损失的次数。
要打开自动验证停止,请指定一个正整数作为 'ValidationPatience' 值。 如果使用 Inf 的默认值,则训练在达到最大 epoch 数后停止。
要指定验证数据,请使用 'ValidationData' 名称-值对组参数。

示例:'ValidationPatience',5

Solver Options
  • ‘InitialLearnRate’ - 初始学习率

用于训练的初始学习率,指定为逗号分隔的对,
由 'InitialLearnRate' 和一个正标量组成。
“sgdm”求解器的默认值为 0.01,
“rmsprop”和“adam”求解器的默认值为 0.001。
如果学习率太低,那么训练需要很长时间。
如果学习率太高,那么训练可能会达到次优结果或发散。

示例:'InitialLearnRate',0.03

  • LearnRateSchedule’ - 在训练期间降低学习率的选项

用于在训练期间降低学习率的选项,指定为逗号分隔的对,
由 'LearnRateSchedule' 和以下项之一组成:

'none' - 学习率在整个训练过程中保持不变。

'piecewise' - 软件通过乘以某个因子来每隔一定数量的 epoch 更新学习率。
使用 LearnRateDropFactor 名称-值对组参数指定该因子的值。
使用 LearnRateDropPeriod 名称-值对组参数指定乘法间元数。

示例:'LearnRateSchedule','piecewise'

  • ‘LearnRateDropPeriod’ - 降低学习率的时期数

用于降低学习率的时期数,指定为逗号分隔的对,
由 'LearnRateDropPeriod' 和一个正整数组成。
此选项仅在 LearnRateSchedule 的值为“分段”时有效。

每次经过指定数量的 epoch 时,软件都会将全局学习率与下降因子相乘。
使用 LearnRateDropFactor 名称-值对组参数指定下降因子。

示例:'LearnRateDropPeriod',3

  • ‘LearnRateDropFactor’ - 降低学习率的因子

用于降低学习率的因子,指定为逗号分隔的对,
由 'LearnRateDropFactor' 和一个从 0 到 1 的标量组成。
此选项仅在 LearnRateSchedule 的值为 'piecewise' 时有效。

LearnRateDropFactor 是一个乘法因子,
在每次经过一定数量的 epoch 时应用于学习率。
使用 LearnRateDropPeriod 名称-值对组参数指定时期数。

  • ‘L2Regularization’ - L2 正则化因子

L2 正则化(权重衰减)的因子,指定为逗号分隔的对,
由 'L2Regularization' 和一个非负标量组成。

可以使用可学习的参数为网络层的L2正则化指定乘数。

示例:'L2Regularization',0.0005

  • ‘Momentum’ - 上一步的贡献

上一次迭代的参数更新步骤对当前具有动量的随机梯度下降迭代的贡献,
指定为逗号分隔的对,由 'Momentum' 和一个从 0 到 1 的标量组成。
0 值表示没有来自 上一步,而值为 1 表示上一步的最大贡献。

要指定“Momentum”值,您必须将solverName 设置为“sgdm”。
默认值适用于大多数问题。

示例:'Momentum',0.95

  • ‘GradientDecayFactor’ - 梯度移动平均的衰减率

Adam 求解器的梯度移动平均衰减率,指定为逗号分隔的对,
由 'GradientDecayFactor' 和一个小于 1 的非负标量组成。

要指定“GradientDecayFactor”值,必须将solverName 设置为“adam”。
默认值适用于大多数问题。

示例:'GradientDecayFactor',0.95

  • ‘Squared Gradient Decay Factor’ - 平方梯度移动平均值的衰减率

Adam和RMSProp求解器的梯度移动平均值平方的衰减率,
指定为由'SquaredGradientDecayFactor'
和小于1的非负标量组成的逗号分隔对。

要指定“SquaredGradientDecayFactor”值,
必须将solverName 设置为“adam”或“rmsprop”。
衰减率的典型值为 0.9、0.99 和 0.999,
分别对应于 10、100 和 1000 次参数更新的平均长度。
Adam 求解器的默认值为 0.999。 RMSProp 求解器的默认值为 0.9。

示例:'SquaredGradientDecayFactor',0.99

  • ‘Epsilon’ - 分母偏移

Adam 和 RMSProp 求解器的分母偏移,
指定为逗号分隔的对组,由 'Epsilon' 和一个正标量组成。
求解器将偏移添加到网络参数更新中的分母,以避免被零除。

要指定“Epsilon”值,必须将solverName 设置为“adam”或“rmsprop”。
默认值适用于大多数问题。

示例:'Epsilon',1e-6

  • ‘ResetInputNormalization’ - 重置输入层标准化的选项

重置输入层归一化的选项,指定为以下值之一:

true – 重置输入层归一化统计数据并在训练时重新计算它们。

false – 当它们为空时,在训练时计算归一化统计数据。

  • ‘BatchNormalizationStatistics’ - 评估批量标准化层中的统计数据的模式

用于评估批量归一化层中的统计数据的模式,指定为以下之一:
'population' – 使用统计数据。
训练后,该软件通过再次传递训练数据来
最终确定统计数据,并使用所得的均值和方差。
'moving' – 使用更新步骤给出的运行
估计来近似训练期间的统计数据。

Gradient Clipping
  • ‘Gradient Threshold’ - 梯度阈值

梯度阈值,指定为逗号分隔的对组,
由 'GradientThreshold' 和 Inf 或一个正标量组成。
如果渐变超过GradientThreshold的值,
则根据GradientThresholdMethod裁剪渐变。

示例:“ GradientThreshold”,6

  • ‘GradientThresholdMethod’ - 梯度阈值方法

用于裁剪超过梯度阈值的梯度值的梯度阈值方法,
指定为逗号分隔的对组,
包含 'GradientThresholdMethod' 和以下之一:

'l2norm' - 如果可学习参数的梯度的
L2 范数大于 GradientThreshold,
则缩放梯度以使 L2 范数等于 GradientThreshold。

'global-l2norm' - 如果全局 L2 范数 L 大于 GradientThreshold,
则按 GradientThreshold/L 因子缩放所有梯度。
全局 L2 范数考虑了所有可学习的参数。

'absolute-value' - 如果可学习参数梯度中单个偏导数的绝对值大于
GradientThreshold,则缩放偏导数使其幅度等于
GradientThreshold 并保留偏导数的符号。

示例:'GradientThresholdMethod','global-l2norm'

Sequence Options
  • ‘SequenceLength’ - 填充、截断或拆分输入序列的选项

填充、截断或拆分输入序列的选项,指定为以下之一:

'longest' - 填充每个小批量中的序列,使其与最长序列的长度相同。
此选项不会丢弃任何数据,但填充可能会给网络带来噪音。

'shortest' - 截断每个 mini-batch 中的序列,
使其长度与最短序列相同。
此选项可确保不添加填充,代价是丢弃数据。
正整数 - 对于每个小批量,将序列填充到指定长度
的最接近的大于小批量中最长序列长度的倍数,
然后将序列拆分为指定长度的较小序列。
如果发生拆分,则软件会创建额外的小批量。
如果完整序列不适合内存,请使用此选项。
或者,尝试通过将“MiniBatchSize”选项
设置为较低的值来减少每个小批量的序列数。

示例:'SequenceLength','shortest'

  • ‘SequencePaddingDirection’ - 填充或截断的方向

填充或截断的方向,指定为以下之一:

'right' - 填充或截断右侧的序列。
序列在同一时间步开始,软件会在序列末尾截断或添加填充。

'left' - 在左侧填充或截断序列。
软件会在序列的开头截断或添加填充,
以便序列在同一时间步长结束。
由于 LSTM 层一次处理一个时间步长的序列数据,
因此当层 OutputMode 属性为“last”时,
最终时间步长中的任何填充都会对层输出产生负面影响。
要填充或截断左侧的序列数据,
请将“SequencePaddingDirection”选项设置为“left”。
对于序列到序列网络
(当每个 LSTM 层的 OutputMode 属性为“sequence” 时),
第一个时间步中的任何填充
都会对早期时间步的预测产生负面影响。
要填充或截断右侧的序列数据,
请将“SequencePaddingDirection”选项设置为“right”。

  • ‘SequencePaddingValue’ - 填充输入序列的值

填充输入序列所依据的值,指定为标量。
该选项仅在 SequenceLength 为 'longest' 或正整数时有效。
不要用 NaN 填充序列,因为这样做会在整个网络中传播错误。

示例:'SequencePaddingValue',-1

Hardware Options
  • ‘ExecutionEnvironment’ - 训练网络的硬件资源

训练网络的硬件资源,指定为以下之一:

'auto' - 使用 GPU(如果可用)。 否则,使用 CPU。

'cpu' - 使用 CPU。

'gpu' - 使用 GPU。

'multi-gpu' - 在一台机器上使用多个 GPU,
使用基于默认集群配置文件的本地并行池。
如果当前没有并行池,
软件会启动一个并行池,池大小等于可用 GPU 的数量。

'parallel' - 根据您的默认集群配置文件使用本地或远程并行池。
如果当前没有并行池,
软件会使用默认集群配置文件启动一个。
如果池可以访问 GPU,
则只有具有唯一 GPU 的工作人员才能执行训练计算。
如果池中没有 GPU,
则在所有可用的 CPU 工作器上进行训练。

  • ‘WorkerLoad’ - 并行工作负载划分

GPU 或 CPU 之间的并行工作负载分配,
指定为逗号分隔的对,由 'WorkerLoad' 和以下项之一组成:

从 0 到 1 的标量 - 每台机器上用于网络训练计算的工作人员的比例。
如果使用启用后台调度的小批量数据存储中的数据训练网络,
则剩余的工作人员会在后台获取和预处理数据。

正整数 - 每台机器上用于网络训练计算的工人数量。
如果您使用启用后台调度的小批量数据存储中的数据训练网络,
则剩余的工作人员会在后台获取和预处理数据。

数字向量 - 并行池中每个工作器的网络训练负载。
如果使用启用后台调度的小批量数据存储中的数据训练网络,
那么可以将工作负载分配为 0 以使用该工作在后台获取数据。
指定的向量必须包含并行池中的每个工作器一个值。

  • ‘DispatchInBackground’ - 使用后台调度

使用后台调度(异步预取队列)从数据存储中读取训练数据,
指定为 false 或 true。
后台调度需要 Parallel Computing Toolbox。
DispatchInBackground 仅支持可分区的数据存储。

Checkpoints
  • ‘CheckpointPath’ - 保存检查点网络的路径

保存检查点网络的路径,
指定为逗号分隔的对组,其中包含 'CheckpointPath' 和一个字符向量。

如果不指定路径(即使用默认的“'”),
则软件不会保存任何检查点网络。
如果您指定路径,则 trainNetwork 在每个 epoch 之后
将检查点网络保存到此路径,并为每个网络分配一个唯一名称。
然后,您可以加载任何检查点网络并从该网络恢复训练。

如果该文件夹不存在,则必须先创建它,然后再指定保存检查点网络的路径。 如果您指定的路径不存在,则 trainingOptions 会返回错误。
有关保存网络检查点的更多信息,请参阅保存检查点网络和恢复训练。

示例:'CheckpointPath','C:\Temp\checkpoint'

  • ‘OutputFcn’ - 输出函数,深度学习网络训练期间自定义输出

要在训练期间调用的输出函数,指定为逗号分隔的对组,
其中包含 'OutputFcn' 和一个函数句柄或函数句柄元胞数组。
trainNetwork 在训练开始前、每次迭代后和训练结束后调用指定函数一次。
如果某个字段未计算或与对输出函数的某个调用不相关,则该字段包含一个空数组。
使用输出函数来显示或绘制进度信息,或者停止训练。
要提前停止训练,请让您的输出函数返回 true。
如果任何输出函数返回true,则训练结束,trainNetwork返回最新的网络。 有关显示如何使用输出函数的示例,请参阅在深度学习网络训练期间自定义输出。

参考资料

​​https://ww2.mathworks.cn/help/deeplearning/ref/trainingoptions.html?searchHighlight=trainingOptions&s_tid=srchtitle#mw_77b727c4-ce09-441d-a02d-7002a209c677​​


举报

相关推荐

0 条评论