主要内容

更新自定义训练循环中的批量规范化统计信息

此示例显示如何在自定义训练循环中更新网络状态。

批处理规范化层通过一个小批处理规范化每个输入通道。为了加快卷积神经网络的训练并降低对网络初始化的敏感性,在卷积层和非线性(如ReLU层)之间使用批量归一化层。

在训练期间,批量归一化层首先通过减去迷你批次均值并除以迷你批量标准偏差来归一化每个通道的激活。然后,该层通过可学习的偏移移动输入β并通过学习的比例因子来缩放它γ..

当网络培训结束时,批量归一化层计算完整培训集的均值和方差,并将值存储在训练有训练训练有素特性。当您使用训练有素的网络对新图像进行预测时,批量归一化层使用训练的均值和方差而不是迷你批量均值和方差,以归一化激活。

为了计算数据集统计信息,批处理规范化层通过使用不断更新的状态来跟踪小批量统计信息。如果要实现自定义训练循环,则必须在小批量之间更新网络状态。

负载培训数据

这个digittrain4darraydata.功能加载手写数字及其数字标签的图像。创建一个ArrayDataStore.对象的图像和角度,然后使用结合函数创建包含所有训练数据的单个数据存储。提取类名。

[XTrain,YTrain]=数字列车4DRARAYDATA;dsXTrain=arrayDatastore(XTrain,'iteationdimension'4);dsytrain = ArrayDataStore(Ytrain);dstrain =组合(Dsxtrain,Dstrain);ClassNames =类别(Ytrain);numclasses = numel(classnames);

定义网络

定义网络并使用该网络指定平均图像'意思'选项在图像输入层中。

图层= [imageInputLayer([28 28 1],“姓名”,“输入”,'意思',平均值(xtrain,4))卷积2dlayer(5,20,“姓名”,'conv1')批处理规范化层(“姓名”,“bn1”)雷卢耶(“姓名”,'relu1')卷积2dlayer(3,20,'填充'1.“姓名”,'conv2')批处理规范化层(“姓名”,“bn2”)雷卢耶(“姓名”,“relu2”)卷积2dlayer(3,20,'填充'1.“姓名”,'conv3')批处理规范化层(“姓名”,“bn3”)雷卢耶(“姓名”,“relu3”)全连接列(numcrasses,“姓名”,'fc')softmaxlayer(“姓名”,“softmax”)];Lgraph = LayerGraph(层);

创建一个dlnetwork.来自图层图的对象。

dlnet=dlnetwork(lgraph)
dlnet = dlnetwork with属性:图层:[12×1 nnet.cnn.layer.layer]连接:[11×2表]了解:[14×3表]状态:[6×3表]输入名称:{'输入'}输出名:{softmax'}

查看网络状态。每个批量归一化层都有一个训练有训练参数和a训练有素分别包含数据集平均值和方差的参数。

dlnet.State
ans =.6×3表图层参数值______________________ _______________“bn1”“训练映射”{1×1×20单}“bn1”“训练variance”{1×1×20单个}“bn2”“训练映射”{1×1×20单}“bn2“”训练“{1×1×20单}”bn3“”训练映射“{1×1×20单}”bn3“”训练variance“{1×1×20单}

定义模型渐变功能

创建函数MapicalGRADENTERS.,列在示例的末尾,它将其作为输入adlnetwork.对象DLNET.,以及一小批输入数据dlX具有相应的标签Y,并返回关于学习参数的损失的渐变DLNET.以及相应的损失。

指定培训选项

使用迷你批量大小为128的五个时期列车。对于SGDM优化,请指定0.01的学习率和0.9的动量。

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

将培训进度可视化到绘图中。

阴谋=“培训进度”;

火车模型

采用小公子处理和管理迷你批次的图像。对于每个迷你批处理:

  • 使用自定义小批量预处理功能预处理小批量(在此示例的末尾定义为单热编码类标签。

  • 使用标注标签格式化图像数据“SSCB”(空间、空间、通道、批次)。默认情况下小公子对象将数据转换为dlarray.底层类型的对象单一的. 不要向类标签添加格式。

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

MBQ = Minibatchqueue(Dstrain,...“MiniBatchSize”,小匹马,...“MiniBatchFcn”,@minibatch,...'minibatchformat',{“SSCB”,''});

使用自定义训练循环训练模型。对于每个历元,洗牌数据并循环处理小批量数据。在每次迭代结束时,显示培训进度。对于每个小批量:

  • 评估模型梯度,状态和使用损失德尔费瓦尔MapicalGRADENTERS.函数并更新网络状态。

  • 使用使用的网络参数更新网络参数sgdmupdate功能。

初始化训练进度图。

如果plots ==“培训进度”figure lineLossTrain=动画线('颜色',[0.85 0.325 0.098]);ylim([0 inf])xlabel(“迭代”)ylabel(“损失”) 网格结束

初始化SGDM解算器的速度参数。

速度=[];

培训网络。

迭代= 0;start = tic;%环游各个时代。对于历元=1:numEpochs%Shuffle数据。洗牌(mbq)%循环在迷你批次。尽管Hasdata(MBQ)迭代=迭代+ 1;%读取迷你批次数据并将标签转换为虚拟%变量。[dlX,dlY]=next(mbq);%评估模型渐变,状态和使用DLFeval和丢失%modelGradients运行并更新网络状态。[gradients,state,loss]=dlfeval(@modelGradients,dlnet,dlX,dlY);dlnet.State=状态;%使用SGDM Optimizer更新网络参数。[DLNET,速度] = SGDMUPDATE(DLNET,梯度,速度,学习,动量);%显示培训进度。如果plots ==“培训进度”d =持续时间(0,0,toc(start),“格式”,“hh:mm:ss”);Addpoints(LineLoStrain,迭代,Double(收集(提取数据(丢失))))标题(“时代:”+纪元+,已过:+字符串(d))绘制结束结束结束

测试模型

通过将测试集上的预测与真实标签和角度进行比较,测试模型的分类精度。使用小公子对象具有与训练数据相同的设置。

[XTest,YTest]=Digittest4ArrayData;dsXTest=arrayDatastore(XTest,'iteationdimension',4); dsYTest=阵列数据存储(YTest);dsTest=联合收割机(dsXTest,dsYTest);mbqTest=minibatchqueue(dsTest,...“MiniBatchSize”,小匹马,...“MiniBatchFcn”,@minibatch,...'minibatchformat',{“SSCB”,''});

使用该图像对图像进行分类模特预分规函数,列在示例末尾。该函数返回预测的类以及与真值的比较。

[classespricictions,classcorr] = modelpricictions(dlnet,mbqtest,classnames);

评估分类准确性。

精度=均值(ClassCorr)
精度= 0.9946.

模型梯度函数

这个MapicalGRADENTERS.函数接受一个输入dlnetwork.对象DLNET.和一小批输入数据dlX具有相应的标签Y,并返回关于学习参数的损失的渐变DLNET.,网络状态和丢失。要自动计算渐变,请使用Dlgradient.功能。

功能[梯度,状态,损失]=模型梯度(dlnet,dlX,Y)[dlYPred,状态]=正向(dlnet,dlX);损失=交叉熵(dlYPred,Y);梯度=dlgradient(损失,dlnet.Learnables);结束

模型预测功能

这个模特预分规函数接受一个输入dlnetwork.对象DLNET., 一种小公子输入数据MBQ.,并通过迭代所有数据来计算模型预测小公子.该功能使用onehotdecode功能要查找最高分的预测类,然后将预测与真实类进行比较。该函数返回代表正确和不正确的预测的预测和零的矢量。

功能[classespredictions,classcorr] = modelpricictions(dlnet,mbq,classes)classespredictions = [];classcorr = [];尽管hasdata(mbq)[dlX,dlY]=next(mbq);%使用模型函数进行预测。dlYPred=预测(dlnet,dlX);%确定预测类。ypredbatch = onehotdecode(dlypred,classes,1);classespredictions = [classespricictions ypredbatch];%比较预测类和真实类Y=一次热解码(DY,类,1);classCorr=[classCorr YPredBatch==Y];结束结束

迷你批处理预处理功能

这个预处理小批量函数使用以下步骤预处理数据:

  1. 从传入单元格数组中提取图像数据并将其连接到数字阵列中。通过第四维度连接图像数据将第三维度添加到每个图像,以用作单例通道维度。

  2. 从进入的单元阵列中提取标签数据,并沿着第二维地连接到分类阵列中..

  3. 单热编码分类标签到数字阵列中。编码到第一维度生成符合网络输出的形状的编码阵列。

功能[X,Y]=预处理小批量(XCell,YCell)%从单元格和连接中提取图像数据X=cat(4,XCell{:});%提取来自细胞和连接的标记数据Y=cat(2,YCell{:});%单热量编码标签y = onehotencode(y,1);结束

另见

|||||||||

相关话题