主要内容

在定制培训循环更新批规范化统计

这个例子展示了如何在一个自定义更新网络状态训练循环。

一批标准化层规范化mini-batch每个输入通道。加快培训卷积神经网络,减少网络初始化敏感的缺点,使用批卷积层之间的归一化层和非线性,如ReLU层。

在培训期间,第一批标准化层正常化每个通道的激活减去mini-batch均值和除以mini-batch标准差。然后,层变化的输入可学的抵消β可学的比例因子和尺度γ

网络训练完成后,将批处理计算均值和方差归一化层对整个训练集和商店中的值TrainedMeanTrainedVariance属性。当你使用一个训练有素的网络进行预测的新图像,批处理使用训练有素的均值和方差归一化层而不是mini-batch均值和方差标准化激活。

计算数据集的统计数据,批量标准化层跟踪mini-batch统计数据通过使用一个不断更新的状态。如果你是实现一个自定义训练循环,那么你必须更新mini-batches之间的网络状态。

负荷训练数据

digitTrain4DArrayData函数加载手写数字图像和数字标签。创建一个arrayDatastore对象的图像和角度,然后使用结合函数来生成一个单一的数据存储,其中包含所有的训练数据。提取类名。

[XTrain, YTrain] = digitTrain4DArrayData;dsXTrain = arrayDatastore (XTrain,“IterationDimension”4);dsYTrain = arrayDatastore (YTrain);dsTrain =结合(dsXTrain dsYTrain);一会=类别(YTrain);numClasses =元素个数(类名);

定义网络

定义网络和指定图像的平均使用“的意思是”选择在图像输入层。

层= [imageInputLayer ([28 28 1],“名字”,“输入”,“的意思是”意味着(XTrain 4)) convolution2dLayer(5年,20年“名字”,“conv1”)batchNormalizationLayer (“名字”,“bn1”)reluLayer (“名字”,“relu1”20岁的)convolution2dLayer (3“填充”, 1“名字”,“conv2”)batchNormalizationLayer (“名字”,“bn2”)reluLayer (“名字”,“relu2”20岁的)convolution2dLayer (3“填充”, 1“名字”,“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”}

查看网络状态。每一批有归一化层TrainedMean参数和TrainedVariance分别包含数据集参数均值和方差。

dlnet.State
ans =6×3表层参数值_____ _________________售予“bn1”“TrainedMean”{1×1×20单}“bn1”“TrainedVariance”{1×1×20单}“bn2”“TrainedMean”{1×1×20单}“bn2”“TrainedVariance”{1×1×20单}“bn3”“TrainedMean”{1×1×20单}“bn3”“TrainedVariance”{1×1×20单}

定义模型梯度函数

创建函数modelGradients上市的例子,作为输入dlnetwork对象dlnet,mini-batch输入数据dlX与相应的标签Y的梯度,并返回损失对可学的参数dlnet和相应的损失。

指定培训选项

火车5时代使用mini-batch大小为128。个优化,指定一个学习速率的0.01和0.9的动力。

numEpochs = 5;miniBatchSize = 128;learnRate = 0.01;动量= 0.9;

可视化培训进展阴谋。

情节=“训练进步”;

火车模型

使用minibatchqueue处理和管理mini-batches图像。为每个mini-batch:

  • 使用自定义mini-batch预处理功能preprocessMiniBatch(在这个例子中定义)一个炎热的编码类标签。

  • 格式的图像数据维度标签“SSCB”(空间、空间、通道、批)。默认情况下,minibatchqueue把数据转换为对象dlarray对象与基本类型。不格式添加到类的标签。

  • 火车在GPU如果一个是可用的。默认情况下,minibatchqueue将每个输出转换为对象gpuArray如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)

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

火车模型使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。在每次迭代结束时,显示培训进展。为每个mini-batch:

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

  • 更新网络参数使用sgdmupdate函数。

初始化培训进展阴谋。

如果情节= =“训练进步”图lineLossTrain = animatedline (“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)结束

个解算器初始化速度参数。

速度= [];

培训网络。

迭代= 0;开始=抽搐;%循环时期。时代= 1:numEpochs%洗牌数据。洗牌(兆贝可)%在mini-batches循环。hasdata(兆贝可)迭代=迭代+ 1;%读mini-batch数据和标签转换为假%变量。[dlX,海底]=下一个(兆贝可);%评估模型梯度、州和使用dlfeval和损失% modelGradients功能和更新网络状态。(渐变、州损失)= dlfeval (@modelGradients, dlnet dlX,海底);dlnet.State= state;%更新使用个优化网络参数。[dlnet,速度]= sgdmupdate (dlnet、渐变速度,learnRate动量);%显示培训进展。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束

测试模型

测试模型的分类精度通过比较测试集上的预测与真正的标签和角度。管理测试数据集使用minibatchqueue作为训练数据对象使用相同的设置。

[XTest,欧美]= digitTest4DArrayData;dsXTest = arrayDatastore (XTest,“IterationDimension”4);dsYTest = arrayDatastore(欧美);dst =结合(dsXTest dsYTest);mbqTest = minibatchqueue (dst,“MiniBatchSize”miniBatchSize,“MiniBatchFcn”@preprocessMiniBatch,“MiniBatchFormat”,{“SSCB”,});

使用的图像进行分类modelPredictions函数,列出的例子。函数返回预测类和与真实值的比较。

[classesPredictions, classCorr] = modelPredictions (dlnet mbqTest,类名);

评估分类精度。

精度=意味着(classCorr)
精度= 0.9946

模型梯度函数

modelGradients函数作为输入dlnetwork对象dlnet和mini-batch输入数据dlX与相应的标签Y的梯度,并返回损失对可学的参数dlnet、网络状态和损失。自动计算梯度,使用dlgradient函数。

函数(渐变、州损失)= modelGradients (dlnet dlX Y) [dlYPred、州]=向前(dlnet dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);结束

模型的预测函数

modelPredictions函数作为输入dlnetwork对象dlnet,一个minibatchqueue的输入数据兆贝可,并通过迭代计算模型预测所有数据minibatchqueue。这个函数使用onehotdecode函数找到预测类最高的分数,然后比较了预测与真正的类。预测和一个向量的函数返回0和1表示正确的和不正确的预测。

函数[classesPredictions, classCorr] = modelPredictions (dlnet、兆贝可类)classesPredictions = [];classCorr = [];hasdata(兆贝可)[dlX,海底]=(兆贝可);%使用模型函数进行预测。dlYPred =预测(dlnet dlX);%确定预测类。YPredBatch = onehotdecode (dlYPred类1);classesPredictions = [classesPredictions YPredBatch];%比较预测和真正的类Y = onehotdecode(海底、类1);classCorr = [classCorr YPredBatch = = Y);结束结束

小批预处理功能

preprocessMiniBatch使用以下步骤:预处理数据函数

  1. 提取图像数据从传入单元阵列和连接到一个数字数组。连接图像数据在四维空间增加了一个三维图像,作为单通道尺寸。

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

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

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

另请参阅

|||||||||

相关的话题