这个例子展示了如何训练网络,把手写的数字和一个定制的学习速率的时间表。
如果trainingOptions
不提供你需要的选项(例如,一个定制的学习速率的时间表),然后你可以定义自己的自定义训练循环使用自动分化。
这个例子列车网络分类手写数字的基于时间的衰减学习速率的时间表:对于每一次迭代,求解器使用的学习速率 ,在那里t是迭代数, 最初的学习速率,k是衰减的。
数字数据加载图像数据存储使用imageDatastore
功能和指定包含图像数据的文件夹。
dataFolder = fullfile (toolboxdir (“nnet”),“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,…“IncludeSubfolders”,真的,…。“LabelSource”,“foldernames”);
分区数据为训练集和验证集。留出10%的验证使用的数据splitEachLabel
函数。
[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机”);
在这个例子中使用的网络28-by-28-by-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属性:层:[12×1 nnet.cnn.layer.Layer]连接:[11×2表]可学的:[14×3表]状态:[6×3表]InputNames:{“输入”}OutputNames: {“softmax”}
创建函数modelGradients
上市的例子,需要一个dlnetwork
对象,mini-batch输入数据与相应的标签和返回梯度的损失对网络中可学的参数和相应的损失。
火车十世mini-batch大小为128。
numEpochs = 10;miniBatchSize = 128;
指定的选项个优化。指定一个初始学习衰变率0.01,0.01,0.9和动量。
initialLearnRate = 0.01;衰变= 0.01;动量= 0.9;
创建一个minibatchqueue
对象流程和管理mini-batches图像在训练。为每个mini-batch:
使用自定义mini-batch预处理功能preprocessMiniBatch
(在这个例子中定义)转换编码的标签在一个炎热的变量。
格式的图像数据维度标签“SSCB”
(空间、空间、通道、批)。默认情况下,minibatchqueue
把数据转换为对象dlarray
对象与基本类型单
。不格式添加到类的标签。
火车在GPU如果一个是可用的。默认情况下,minibatchqueue
将每个输出转换为对象gpuArray
如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU的万博1manbetx支持版本(并行计算工具箱)。
兆贝可= minibatchqueue (augimdsTrain,…“MiniBatchSize”miniBatchSize,…“MiniBatchFcn”@preprocessMiniBatch,…“MiniBatchFormat”,{“SSCB”,”});
初始化培训进展阴谋。
图lineLossTrain = animatedline (“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)在
个解算器初始化速度参数。
速度= [];
列车网络使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:
评估模型的梯度、州和使用dlfeval
和modelGradients
功能和更新网络状态。
确定基于时间的学习速率衰减学习速率的时间表。
更新网络参数使用sgdmupdate
函数。
显示培训进展。
迭代= 0;开始=抽搐;%循环时期。为时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);%在mini-batches循环。而hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。[dlX,海底]=下一个(兆贝可);%评估模型梯度、州和使用dlfeval和损失% modelGradients功能和更新网络状态。(渐变、州损失)= dlfeval (@modelGradients, dlnet dlX,海底);dlnet。=状态;%确定为基于时间的学习速率衰减学习速率的时间表。learnRate = initialLearnRate /(1 +衰变*迭代);%更新使用个优化网络参数。[dlnet,速度]= sgdmupdate (dlnet、渐变速度,learnRate动量);%显示培训进展。D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束
测试模型的分类精度比较预测验证集和真正的标签。
训练后,使预测新数据不需要标签。创建minibatchqueue
对象只包含测试数据的预测:
忽略标签测试,设置输出的数量mini-batch队列1。
指定相同的mini-batch大小用于培训。
预处理预测使用preprocessMiniBatchPredictors
函数,列出的例子。
对于单一的输出数据存储,指定mini-batch格式“SSCB”
(空间、空间、通道、批)。
numOutputs = 1;mbqTest = minibatchqueue (augimdsValidation numOutputs,…“MiniBatchSize”miniBatchSize,…“MiniBatchFcn”@preprocessMiniBatchPredictors,…“MiniBatchFormat”,“SSCB”);
使用循环mini-batches和分类图像modelPredictions
函数,列出的例子。
预测= modelPredictions (dlnet、mbqTest、类);
评估分类精度。
欧美= imdsValidation.Labels;= =次精度=意味着(预测)
精度= 0.9530
的modelGradients
函数接受一个dlnetwork
对象dlnet
mini-batch的输入数据dlX
与相应的标签Y
并返回梯度的损失对可学的参数dlnet
、网络状态和损失。自动计算梯度,使用dlgradient
函数。
函数(渐变、州损失)= modelGradients (dlnet dlX Y) [dlYPred、州]=向前(dlnet dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);损失=双(收集(extractdata(损失)));结束
的modelPredictions
函数接受一个dlnetwork
对象dlnet
,一个minibatchqueue
的输入数据兆贝可
网络类,计算模型遍历所有数据的预测minibatchqueue
对象。这个函数使用onehotdecode
函数找到预测类最高的分数。
函数预测= modelPredictions (dlnet、兆贝可类)预测= [];而hasdata(兆贝可)dlXTest =下一个(兆贝可);dlYPred =预测(dlnet dlXTest);YPred = onehotdecode (dlYPred、类1)';预测=[预测;YPred];结束结束
的preprocessMiniBatch
函数进行预处理的mini-batch预测和标签使用以下步骤:
使用预处理的图像preprocessMiniBatchPredictors
函数。
从传入单元阵列提取标签数据和连接到一个直言沿着二维数组。
一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。
函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%从细胞中提取标签数据和连接。Y =猫(2,YCell{1:结束});%一个炎热的编码标签。Y, Y = onehotencode (1);结束
的preprocessMiniBatchPredictors
函数进行预处理mini-batch预测因子的提取图像数据从输入单元阵列和连接到一个数字数组。灰度输入,连接在第四维度添加每个图像的三维空间,作为一个单通道维度。
函数X = preprocessMiniBatchPredictors(伊势亚)%连接。猫(X = 4,伊势亚{1:结束});结束
dlarray
|dlgradient
|dlfeval
|dlnetwork
|向前
|adamupdate
|预测
|minibatchqueue
|onehotencode
|onehotdecode