主要内容

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

这个例子展示了如何训练网络,把手写的数字和一个定制的学习速率的时间表。

如果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-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:

  • 评估模型的梯度、州和使用dlfevalmodelGradients功能和更新网络状态。

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

  • 更新网络参数使用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对象dlnetmini-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预测和标签使用以下步骤:

  1. 使用预处理的图像preprocessMiniBatchPredictors函数。

  2. 从传入单元阵列提取标签数据和连接到一个直言沿着二维数组。

  3. 一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。

函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%从细胞中提取标签数据和连接。Y =猫(2,YCell{1:结束});%一个炎热的编码标签。Y, Y = onehotencode (1);结束

Mini-Batch预测预处理功能

preprocessMiniBatchPredictors函数进行预处理mini-batch预测因子的提取图像数据从输入单元阵列和连接到一个数字数组。灰度输入,连接在第四维度添加每个图像的三维空间,作为一个单通道维度。

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

另请参阅

|||||||||

相关的话题