主要内容

使用自定义训练循环训练网络

这个例子展示了如何训练一个网络,用一个定制的学习速率计划来分类手写数字。

如果trainingOptions不提供您需要的选项(例如,自定义学习速率计划),那么您可以使用自动区分定义您自己的自定义训练循环。

这个例子训练网络用基于时间的衰减学习率计划:对于每次迭代,求解器使用给定的学习率 ρ t ρ 0 1 + k t ,在那里t为迭代数, ρ 0 是初始学习率,和k是衰减的。

负荷训练数据

控件将数字数据加载为图像数据存储imageDatastore函数,并指定包含图像数据的文件夹。

dataFolder = fullfile (toolboxdir (“nnet”),“nndemos”“nndatasets”“DigitDataset”);imd = imageDatastore (dataFolder,...“IncludeSubfolders”,真的,...“LabelSource”“foldernames”);

将数据划分为训练集和验证集。方法预留10%的数据用于验证splitEachLabel函数。

[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机”);

本例中使用的网络需要输入尺寸为28 × 28 × 1的图像。若要自动调整训练图像的大小,请使用扩充的图像数据存储。指定要在训练图像上执行的附加增强操作:在水平和垂直轴上随机将图像平移至5像素。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。

inputSize = [28 28 1];pixelRange = [-5 5];imageAugmenter = imageDataAugmenter (...“RandXTranslation”pixelRange,...“RandYTranslation”, pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,“DataAugmentation”, imageAugmenter);

若要自动调整验证图像的大小而不执行进一步的数据扩展,请使用扩展后的图像数据存储,而不指定任何额外的预处理操作。

augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);

确定训练数据中的类数。

类=类别(imdsTrain.Labels);numClasses =元素个数(类);

定义网络

定义图像分类网络。

[imageInputLayer(inputSize,“归一化”“没有”“名字”“输入”20岁的)convolution2dLayer (5“名字”“conv1”) batchNormalizationLayer (“名字”“bn1”) reluLayer (“名字”“relu1”20岁的)convolution2dLayer (3“填充”“相同”“名字”“conv2”) batchNormalizationLayer (“名字”“bn2”) reluLayer (“名字”“relu2”20岁的)convolution2dLayer (3“填充”“相同”“名字”“conv3”) batchNormalizationLayer (“名字”“bn3”) reluLayer (“名字”“relu3”) fullyConnectedLayer (numClasses“名字”“俱乐部”) softmaxLayer (“名字”“softmax”));lgraph = layerGraph(层);

创建一个dlnetwork对象从层图。

dlnet = dlnetwork (lgraph)
dlnet = dlnetwork with properties: Layers: [12×1 net.cnn.layer. layer] Connections: [11×2 table] Learnables: [14×3 table] State: [6×3 table] InputNames: {'input'} OutputNames: {'softmax'}

定义模型梯度函数

创建函数modelGradients,它需要一个dlnetwork对象中,具有相应标签的一小批输入数据并返回损失相对于网络中可学习参数的梯度和相应的损失。

指定培训选项

训练10个时代的小批量128。

numEpochs = 10;miniBatchSize = 128;

指定SGDM优化选项。指定初始学习率为0.01,衰减0.01,动量为0.9。

initialLearnRate = 0.01;衰变= 0.01;动量= 0.9;

火车模型

创建一个minibatchqueue对象,在训练期间处理和管理小批量图像。为每个mini-batch:

  • 使用自定义小批量预处理功能preprocessMiniBatch(在本例的最后定义)将标签转换为一次性编码变量。

  • 使用尺寸标签格式化图像数据“SSCB”(spatial, spatial, channel, batch)。默认情况下,minibatchqueue对象将数据转换为dlarray具有底层类型的对象.不要向类标签添加格式。

  • 在可用的GPU上进行训练。默认情况下,minibatchqueue对象将每个输出转换为gpuArray如果有可用的GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。万博1manbetx有关支持的设备的信息,请参见万博1manbetxGPU支万博1manbetx持情况(并行计算工具箱)

兆贝可= minibatchqueue (augimdsTrain,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”, {“SSCB”''});

初始化培训进度图。

figure lineosstrain = animatedline(“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”) ylabel (“损失”网格)

初始化SGDM求解器的速度参数。

速度= [];

使用自定义训练循环训练网络。对于每个epoch,洗牌数据并在小批数据上循环。为每个mini-batch:

  • 方法评估模型的梯度、状态和损失dlfevalmodelGradients函数和更新网络状态。

  • 确定基于时间的衰减学习速率计划的学习速率。

  • 使用sgdmupdate函数。

  • 显示训练进度。

迭代= 0;开始=抽搐;%循环纪元。时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);%循环小批。Hasdata (mbq) iteration = iteration + 1;%读取小批数据。[dlX, dlY] = next(mbq);使用dlfeval和% modelgradient函数和更新网络状态。(渐变、州损失)= dlfeval (@modelGradients, dlnet dlX,海底);dlnet。=状态;为基于时间的衰减学习率计划确定学习率。learnRate = initialLearnRate/(1 +衰减*迭代);%使用SGDM优化器更新网络参数。[dlnet,速度]= sgdmupdate (dlnet、渐变速度,learnRate动量);%显示训练进度。D =持续时间(0,0,toc(开始),“格式”“hh: mm: ss”);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束

测试模型

将验证集上的预测结果与真实标签进行比较,检验模型的分类精度。

培训后,对新数据进行预测不需要标签。创建minibatchqueue对象,仅包含测试数据的预测器:

  • 若要忽略用于测试的标签,请将迷你批处理队列的输出数量设置为1。

  • 指定与培训相同的小批量大小。

  • 的预处理预测器preprocessMiniBatchPredictors函数,列在示例的最后。

  • 对于数据存储的单个输出,指定mini-batch格式“SSCB”(spatial, spatial, channel, batch)。

numOutputs = 1;mbqTest = minibatchqueue (augimdsValidation numOutputs,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatchPredictors,...“MiniBatchFormat”“SSCB”);

循环使用小批量并分类使用的图像modelPredictions函数,列在示例的最后。

预测= modelPredictions (dlnet、mbqTest、类);

评估分类精度。

欧美= imdsValidation.Labels;精度=平均值(预测== YTest)
精度= 0.9530

模型梯度函数

modelGradients函数接受一个dlnetwork对象dlnet,输入数据的一小批dlX与相应的标签Y并返回损失相对于可学习参数的梯度dlnet,网络状态,以及损失。要自动计算梯度,请使用dlgradient函数。

函数[gradient,state,loss] = modelGradients(dlnet,dlX,Y) [dlpred,state] = forward(dlnet,dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);损失=双(收集(extractdata(损失)));结束

模型的预测函数

modelPredictions函数接受一个dlnetwork对象dlnet,一个minibatchqueue的输入数据兆贝可和网络类,并通过迭代所有数据来计算模型预测minibatchqueue对象。函数使用onehotdecode函数查找预测得分最高的类。

函数[] = [];hasdata(mbq) dlXTest = next(mbq);dlYPred =预测(dlnet dlXTest);YPred = onehotdecode (dlYPred、类1)';预测=[预测;YPred];结束结束

小批量预处理功能

preprocessMiniBatch函数使用以下步骤对一小批预测器和标签进行预处理:

  1. 对图像进行预处理preprocessMiniBatchPredictors函数。

  2. 从传入的单元格数组中提取标签数据,并沿着第二个维度连接到一个分类数组中。

  3. 一次性将分类标签编码为数字数组。编码到第一个维度会生成一个与网络输出形状匹配的编码数组。

函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%从单元格中提取标签数据并连接。Y =猫(2,YCell{1:结束});%一次性编码标签。Y, Y = onehotencode (1);结束

小批量预测器预处理功能

preprocessMiniBatchPredictors函数通过从输入单元数组提取图像数据并连接到一个数字数组来预处理一小批预测器。对于灰度输入,连接第四个维度为每个图像添加第三个维度,用作单通道维度。

函数X = preprocessMiniBatchPredictors(伊势亚)%连接。猫(X = 4,伊势亚{1:结束});结束

另请参阅

|||||||||

相关的话题