这个例子展示了如何训练一个网络,用一个定制的学习速率计划来分类手写数字。
如果trainingOptions
不提供您需要的选项(例如,自定义学习速率计划),则您可以使用自动差异定义自己的自定义训练循环。
此示例训练网络使用基于时间的衰变学习率计划:对于每个迭代,解算器使用 哪里t为迭代数, 是初始学习率,和k是腐烂。
使用将数字数据加载为图像数据存储imageDatastore
函数,并指定包含图像数据的文件夹。
dataFolder=fullfile(toolboxdir(“内特”),“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,...“IncludeSubfolders”符合事实的....“LabelSource”,“foldernames”);
将数据划分为培训和验证集。使用splitEachLabel
函数。
[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机化”);
本例中使用的网络需要输入尺寸为28 × 28 × 1的图像。若要自动调整训练图像的大小,请使用扩充的图像数据存储。指定要在训练图像上执行的附加增强操作:在水平和垂直轴上随机将图像平移至5像素。数据增强有助于防止网络过度拟合和记忆训练图像的确切细节。
inputSize = [28 28 1];pixelRange = [-5 5];imageAugmenter = imageDataAugmenter (...“RandXTranslation”,像素范围,...“RandYTranslation”,pixelRange);augimdsTrain=增强的图像数据存储(inputSize(1:2),imdsTrain,“DataAugmentation”, imageAugmenter);
要在不执行进一步数据扩充的情况下自动调整验证图像的大小,请使用扩充图像数据存储,而不指定任何其他预处理操作。
augimdsValidation=增强图像数据存储(inputSize(1:2),imdsValidation);
确定培训数据中的课程数。
类=类别(imdsTrain.Labels);numclass=numel(类);
定义图像分类网络。
层=[imageInputLayer(inputSize,“正常化”,“没有”,“名字”,“输入”20岁的)convolution2dLayer (5“名字”,“conv1”)批处理规范化层(“名字”,“bn1”) reluLayer (“名字”,“relu1”)卷积2层(3,20,“填充”,“相同”,“名字”,“conv2”)批处理规范化层(“名字”,“bn2”) reluLayer (“名字”,“relu2”)卷积2层(3,20,“填充”,“相同”,“名字”,“conv3”)批处理规范化层(“名字”,“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;
创建一个小型批处理队列
对象,该对象在培训期间处理和管理图像的小批量。对于每个小批量:
使用自定义小批量预处理功能preprocessMiniBatch
(在本例的最后定义)将标签转换为一次性编码变量。
使用标注标签格式化图像数据“SSCB”
(空间、空间、通道、批次)。默认情况下小型批处理队列
对象将数据转换为dlarray
具有底层类型的对象仅有一个的
.不要向类标签添加格式。
在可用的GPU上进行训练。默认情况下,小型批处理队列
对象将每个输出转换为gpuArray
如果有可用的GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持的设备的信息,请参见金宝appGPU支金宝app持情况(并行计算工具箱).
兆贝可= minibatchqueue (augimdsTrain,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”@preprocessMiniBatch,...“MiniBatchFormat”,{“SSCB”,”});
初始化训练进度图。
figure lineLossTrain=动画线(“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)伊拉贝尔(“损失”网格)在…上
初始化SGDM求解器的速度参数。
速度= [];
使用自定义训练循环训练网络。对于每个历元,洗牌数据,并在小批量数据上循环。对于每个小批量:
方法评估模型的梯度、状态和损失德尔费瓦尔
和modelGradients
函数并更新网络状态。
确定基于时间的衰减学习速率计划的学习速率。
使用sgdmupdate
函数。
显示训练进度。
迭代= 0;开始=抽搐;%环游各个时代。为历元=1:numEpochs%洗牌数据。洗牌(mbq);%在小批量上循环。而hasdata(mbq)迭代=迭代+1;%读取小批量数据。[dlX, dlY] = next(mbq);%使用dlfeval和%modelGradients运行并更新网络状态。[gradients,state,loss]=dlfeval(@modelGradients,dlnet,dlX,dlY);dlnet.state=state;%确定基于时间的衰减学习速率计划的学习速率。learnRate = initialLearnRate/(1 +衰减*迭代);%使用SGDM优化器更新网络参数。[dlnet,速度]=sgdmupdate(dlnet,梯度,速度,学习率,动量);%显示训练进度。D =持续时间(0,0,toc(开始),“格式”,“hh:mm:ss”);添加点(lineLossTrain、迭代、丢失)标题(“时代:”+时代+”,过去:“+ drawnow字符串(D))结束结束
将验证集上的预测结果与真实标签进行比较,检验模型的分类精度。
培训后,对新数据进行预测不需要标签。创建小型批处理队列
对象,仅包含测试数据的预测器:
若要忽略用于测试的标签,请将迷你批处理队列的输出数量设置为1。
指定用于培训的相同小批量。
的预处理预测器预处理预测器
函数,列在示例末尾。
对于数据存储的单个输出,指定mini-batch格式“SSCB”
(空间、空间、通道、批次)。
numOutputs=1;mbqTest=minibatchqueue(augimdsValidation,numOutputs,...“MiniBatchSize”miniBatchSize,...“MiniBatchFcn”,@预处理预测因子,...“MiniBatchFormat”,“SSCB”);
循环使用小批量并分类使用的图像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
,一个小型批处理队列
的输入数据兆贝可
和网络类,并通过迭代所有数据来计算模型预测小型批处理队列
对象。函数使用onehotdecode
函数查找预测得分最高的类。
函数预测=模型预测(dlnet、mbq、类)预测=[];而hasdata(mbq)dlXTest=next(mbq);dlYPred=predict(dlnet,dlXTest);YPred=onehotdecode(dlYPred,classes,1)’;predictions=[predictions;YPred];结束结束
的preprocessMiniBatch
函数使用以下步骤对一小批预测器和标签进行预处理:
对图像进行预处理预处理预测器
函数。
从传入的单元格数组中提取标签数据,并沿第二维度连接到分类数组中。
一次性将分类标签编码为数字数组。编码到第一个维度会生成一个与网络输出形状匹配的编码数组。
函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%从单元格中提取标签数据并连接。Y =猫(2,YCell{1:结束});%一次性编码标签。Y=onehotcode(Y,1);结束
的预处理预测器
函数通过从输入单元数组提取图像数据并连接到一个数字数组来预处理一小批预测器。对于灰度输入,连接第四个维度为每个图像添加第三个维度,用作单通道维度。
函数X = preprocessMiniBatchPredictors(伊势亚)%连接。猫(X = 4,伊势亚{1:结束});结束
dlarray
|dlgradient
|德尔费瓦尔
|dlnetwork
|向前
|adamupdate
|预测
|小型批处理队列
|onehotencode
|onehotdecode