设置参数并训练卷积神经网络
按照指定卷积神经网络的层中所述定义神经网络的层后,下一步是为网络设置训练选项。使用 trainingOptions
函数定义全局训练参数。要训练网络,请使用 trainingOptions
返回的对象作为 trainNetwork
函数的输入参数。例如:
options = trainingOptions('adam'); trainedNet = trainNetwork(data,layers,options);
具有可学习参数的层也有用于调整学习参数的选项。有关详细信息,请参阅在卷积层和全连接层中设置参数。
指定求解器和最大轮数
trainNetwork
可以使用随机梯度下降的不同变体来训练网络。使用 trainingOptions
的 solverName
参数指定优化算法。为了最小化损失,这些算法通过在损失函数的负梯度方向上采用小步长来更新网络参数。
'adam'
(派生自自适应矩估计)求解器通常适合作为首先尝试的优化器。您也可以尝试 'rmsprop'
(均方根传播)和 'sgdm'
(带动量的随机梯度下降)优化器,看看这是否能改进训练。不同的问题最好采用不同的求解器。有关不同求解器的详细信息,请参阅Stochastic Gradient Descent。
求解器在每一步都使用数据的一个子集来更新参数。此子集称为小批量。您可以使用 trainingOptions
的 'MiniBatchSize'
名称-值对组参数来指定小批量的大小。每次参数更新都称为一次迭代。对整个数据集的一次完整遍历称为一轮训练。您可以使用 trainingOptions
的 'MaxEpochs'
名称-值对组参数来指定要训练的最大轮数。默认值为 30,但您可以为小型网络或微调和迁移学习选择较少的轮数,因为大多数学习已完成。
默认情况下,软件会在训练前对数据进行一次乱序处理。您可以使用 'Shuffle'
名称-值对组参数来更改此设置。
指定和修改学习率
您可以使用 trainingOptions
的 'InitialLearnRate'
名称-值对组参数来指定全局学习率。默认情况下,trainNetwork
在整个训练过程中使用此值。您可以选择在每经过一定的轮数后,就将学习率乘以一个因子来修改学习率。您可以在训练开始时选择较大的学习率,并在优化过程中逐渐降低该值,而不是在整个训练过程中使用较小的固定学习率。这样做可以缩短训练时间,同时随着训练的进行,使得在接近损失最小值的过程中步长不断变小。
提示
如果训练期间的小批量损失变为 NaN
,则学习率可能过高。请尝试降低学习率,例如降低为三分之一,并重新开始网络训练。
要逐渐降低学习率,请使用 'LearnRateSchedule','piecewise'
名称-值对组参数。如果您选择此选项,trainNetwork
会每经过 10 轮训练就将初始学习率乘以因子 0.1。您可以分别使用 'LearnRateDropFactor'
和 'LearnRateDropPeriod'
名称-值对组参数来指定降低初始学习率和轮数的因子。
指定验证数据
要在训练期间执行网络验证,请使用 trainingOptions
的 'ValidationData'
名称-值对组参数指定验证数据。默认情况下,trainNetwork
通过预测验证数据的响应并计算验证损失和准确度(回归网络的均方根误差),每 50 次迭代验证一次网络。您可以使用 'ValidationFrequency'
名称-值对组参数更改验证频率。如果您的网络中的层在预测过程中的行为不同于在训练过程中的行为(例如,丢弃层),则验证准确度可能高于训练(小批量)准确度。您还可以使用验证数据来实现在验证损失停止减少时自动停止训练。要启用自动验证停止,请使用 'ValidationPatience'
名称-值对组参数。
在训练期间以固定间隔执行验证有助于确定您的网络是否在对训练数据进行过拟合。一个常见的问题是,网络只是简单地“记忆”训练数据,而不是学习使网络能够对新数据作出准确预测的一般特征。要检查您的网络是否正在过拟合,请将训练损失和准确度与对应的验证度量进行比较。如果训练损失明显低于验证损失,或训练准确度明显高于验证准确度,则说明您的网络正在过拟合。
为了减少过拟合,您可以尝试添加数据增强功能。使用 augmentedImageDatastore
对输入图像执行随机变换。这有助于防止网络记忆目标的准确位置和方向。您还可以尝试使用 'L2Regularization'
名称-值对组参数来增加 L2 正则化,在卷积层后使用批量归一化层,以及添加丢弃层。
选择硬件资源
默认情况下,如果 GPU 可用,则 trainNetwork
会将其用于训练。否则,trainNetwork
将使用 CPU。您也可以使用 'ExecutionEnvironment'
名称-值对组参数指定所需的执行环境。您可以指定单个 CPU ('cpu'
)、单个 GPU ('gpu'
)、多个 GPU ('multi-gpu'
),或本地并行池或计算集群 ('parallel'
)。除 'cpu'
以外的所有选项都需要 Parallel Computing Toolbox™。在 GPU 上训练需要支持的 GPU 设备。有关受支持的设备的信息,请参阅GPU Computing Requirements (Parallel Computing Toolbox)。
保存检查点网络并继续训练
Deep Learning Toolbox™ 使您能够在训练期间将神经网络保存为 .mat 文件。当您有大型神经网络或大型数据集并且训练需要很长时间时,这种定期保存特别有用。如果训练因某种原因中断,您可以从上次保存的检查点神经网络继续训练。如果希望 trainNetwork
保存检查点神经网络,则您必须使用 trainingOptions
的 CheckpointPath
选项指定路径名称。如果您指定的路径不存在,则 trainingOptions
会返回错误。
trainNetwork
自动为检查点神经网络文件分配唯一名称。在示例名称 net_checkpoint__351__2018_04_12__18_09_52.mat
中,351 是迭代序号,2018_04_12
是日期,18_09_52
是 trainNetwork
保存神经网络的时间。您可以通过双击检查点神经网络文件或在命令行中使用 load 命令来加载该文件。例如:
load net_checkpoint__351__2018_04_12__18_09_52.mat
trainNetwork
的输入参数,继续进行训练。例如:trainNetwork(XTrain,TTrain,net.Layers,options)
在卷积层和全连接层中设置参数
您可以在具有可学习参数的层(如卷积层和全连接层)中,将学习参数设置为不同于 trainingOptions
指定的全局值。例如,要调整偏置或权重的学习率,您可以分别为层的 BiasLearnRateFactor
或 WeightLearnRateFactor
属性指定值。trainNetwork
函数将您使用 trainingOptions
指定的学习率乘以这些因子。同样,您也可以通过分别指定 BiasL2Factor
和 WeightL2Factor
属性,为这些层中的权重和偏置指定 L2 正则化因子。然后,trainNetwork
将您使用 trainingOptions
指定的 L2 正则化因子乘以这些因子。
初始化卷积层和全连接层中的权重
层权重是可学习参数。您可以直接使用层的 Weights
属性指定权重的初始值。训练网络时,如果层的 Weights
属性不为空,则 trainNetwork
使用 Weights
属性作为初始值。如果 Weights
属性为空,则 trainNetwork
使用该层的 WeightsInitializer
属性指定的初始值。
训练网络
指定网络的层和训练参数后,可以使用训练数据训练网络。数据、层和训练选项均为 trainNetwork
函数的输入参数,如此示例中所示。
layers = [imageInputLayer([28 28 1]) convolution2dLayer(5,20) reluLayer maxPooling2dLayer(2,'Stride',2) fullyConnectedLayer(10) softmaxLayer classificationLayer]; options = trainingOptions('adam'); convnet = trainNetwork(data,layers,options);
训练数据可以是数组、表或 ImageDatastore
对象。有关详细信息,请参阅 trainNetwork
函数参考页。
另请参阅
trainingOptions
| trainNetwork
| Convolution2dLayer
| FullyConnectedLayer