主要内容

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

此示例显示如何训练将手写数字与自定义学习率计划分类的网络。

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

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

负荷训练数据

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

dataFolder = fullfile (toolboxdir (“nnet”),“nndemos”,“nndatasets”,“DigitDataset”);imds = imagedataStore(DataFolder,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);

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

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

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

输入= [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,“归一化”,“没有”,“名字”,“输入”)卷积2dlayer(5,20,“名字”,“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)
[11×2 table] Learnables: [14×3 table] State: [6×3 table] InputNames: {'input'} OutputNames: {'softmax'}

定义模型渐变功能

创建函数MapicalGRADENTERS.,在示例末尾列出,它需要adlnetwork.对象,一个带有相应标签的小批输入数据,并返回关于网络中可学习参数的损失梯度和相应的损失。

指定培训选项

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

numEpochs = 10;miniBatchSize = 128;

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

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

火车模型

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

  • 使用自定义小批量预处理功能preprocessMiniBatch(在本例末尾定义)将标签转换为单热编码的变量。

  • 使用尺寸标签格式化图像数据“SSCB”(空间,空间,通道,批量)。默认情况下,minibatchqueue对象将数据转换为dlarray具有基础类型的对象。不要向类标签添加格式。

  • 在GPU上培训如果有一个可用的。默认情况下,minibatchqueue对象将每个输出转换为gpuArray如果可用GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持设备的信息,请参阅金宝appGPU通金宝app过发布支持(并行计算工具箱)

兆贝可= minibatchqueue (augimdsTrain,“MiniBatchSize”,小匹马,“MiniBatchFcn”@preprocessMiniBatch,“MiniBatchFormat”, {“SSCB”,});

初始化训练进度图。

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

初始化SGDM求解器的velocity参数。

速度= [];

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

  • 评估模型的梯度、状态和损失dlfevalMapicalGRADENTERS.功能和更新网络状态。

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

  • 更新网络参数sgdmupdate函数。

  • 显示训练进度。

迭代= 0;start = tic;%循环周期。时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);在小批量上循环。hasdata(mbq)迭代=迭代+ 1;%读取小批量数据。[dlX, dlY] = next(mbq);使用dlfeval和。评估模型梯度、状态和损失% modelGradients功能和更新网络状态。(渐变、州损失)= 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函数,在示例的最后列出。

  • 对于数据存储的单个输出,指定小批处理格式“SSCB”(空间,空间,通道,批量)。

numOutputs = 1;mbqTest = minibatchqueue (augimdsValidation numOutputs,“MiniBatchSize”,小匹马,“MiniBatchFcn”@preprocessMiniBatchPredictors,“MiniBatchFormat”,“SSCB”);

循环对小批图像进行分类模特预分规函数,在示例的最后列出。

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

评估分类准确性。

ytest = imdsvalidation.labels;精度=均值(预测== ytest)
精度= 0.9530

模型梯度函数

MapicalGRADENTERS.函数接受一个dlnetwork.对象dlnet,迷你批次输入数据dlX具有相应的标签Y并返回关于中可学习参数的损失梯度dlnet、网络状态和损失。要自动计算梯度,请使用dlgradient函数。

函数[渐变,状态,损失] = MapeStradients(DLNET,DLX,Y)[Dlypred,状态] =前进(DLNET,DLX);损失=联肾上腺素(Dlypred,Y);梯度= DLGRADIET(损失,DLNET.LEALNABLE);损失=双(收集(提取物));结束

模型的预测函数

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

函数预测=模型预测(dlnet,mbq,classes)预测= [];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 = CAT(2,YCELL {1:结束});% One-hot编码标签。Y, Y = onehotencode (1);结束

小批量预测器预处理功能

preprocessMiniBatchPredictors功能预处理通过从输入单元阵列中提取图像数据并连接到数字阵列中的图像数据来预处理迷你批量预测器。对于灰度输入,在第四维上连接到每个图像的第三维度,用作单例通道维度。

函数x = preprocessminibatchpredictors(Xcell)%连接。X = CAT(4,Xcell {1:结束});结束

另请参阅

|||||||||

相关的话题