主要内容

在自定义训练循环中更新批量标准化统计信息

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

批量归一化层将跨越批次的每个输入通道标准化。为了加速卷积神经网络的培训,降低网络初始化的敏感性,在卷积层和非线性之间使用批量归一化层,例如Relu层。

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

当网络训练结束时,批标准化层计算整个训练集的平均值和方差,并将值存储在受训男子训练方差财产。当您使用经过训练的网络对新图像进行预测时,批次标准化层使用经过训练的均值和方差而不是小批次均值和方差来标准化激活。

要计算数据集统计信息,批量归一化层通过使用连续更新状态跟踪迷你批次统计信息。如果您正在实现自定义训练循环,则必须更新迷你批处理之间的网络状态。

负荷训练数据

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

[xtrain,ytrain] = DigitTrain4darraydata;dsxtrain = ArrayDataStore(XTrain,“迭代维度”4);dsytrain = ArrayDataStore(Ytrain);dstrain =组合(Dsxtrain,Dstrain);ClassNames =类别(Ytrain);numclasses = numel(classnames);

定义网络

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

图层= [imageInputLayer([28 28 1],'名称''输入''意思',平均值(xtrain,4))卷积2dlayer(5,20,'名称'“conv1”batchnormalizationlayer('名称''bn1')剥离('名称''relu1')卷积层(3,20,“填充”,1,'名称'“conv2”batchnormalizationlayer('名称''bn2')剥离('名称''relu2')卷积层(3,20,“填充”,1,'名称'“conv3”batchnormalizationlayer('名称''bn3')剥离('名称''relu3')全连接列(numcrasses,'名称''fc')软MaxLayer('名称''softmax')];Lgraph = LayerGraph(层);

创建一个数据链路网络对象从图层图中删除。

DLNET = DLNETWORK(LGAPRO)
dlnet=dlnetwork,具有以下属性:层:[12×1 nnet.cnn.layer.layer]连接:[11×2表]可学习性:[14×3表]状态:[6×3表]输入名称:{'input'}输出名称:{'softmax'}

查看网络状态。每个批处理规范化层都有一个受训男子参数和A.训练方差分别包含数据集均值和方差的参数。

dlnet.state.
ans=6×3表层参数值{uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

定义模型渐变功能

创建功能MapicalGRADENTERS.,列在示例的末尾,它将其作为输入a数据链路网络目的DLNET.,以及迷你批次输入数据DLX.具有相应的标签y,并返回关于学习参数的损失的渐变DLNET.和相应的损失。

指定培训选项

使用128的小批量进行五个阶段的训练。对于SGDM优化,指定学习率为0.01,动量为0.9。

numepochs = 5;minibatchsize = 128;学习= 0.01;动量= 0.9;

可视化情节中的培训进度。

plots =.“培训 - 进展”;

火车模型

使用小公子处理和管理小批量图像。对于每个小批量:

  • 使用自定义迷你批处理预处理功能Preprocessminibatch.(在本例末尾定义)对类标签进行热编码。

  • 使用维标签格式化图像数据'SSCB'(空间,空间,频道,批量)。默认情况下,小公子对象将数据转换为dlarray具有基础类型的对象单身的。不要向类标签添加格式。

  • 如果GPU可用,则在GPU上进行培训。默认情况下小公子对象将每个输出转换为aGPUArray.如果可用GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。金宝app有关支持设备的信息,请参阅金宝appGPU版金宝app本支持(并行计算工具箱)

mbq=小型批处理队列(dsTrain,......'minibatchsize',小批量,......'minibatchfcn',@preprocessminibatch,......'minibatchformat',{'SSCB'''});

使用自定义训练循环训练模型。对于每个epoch,将数据和循环扫描迷你批次数据。在每次迭代结束时,显示培训进度。对于每个迷你批处理:

  • 评估模型梯度,状态和使用损失dlfeval.MapicalGRADENTERS.功能并更新网络状态。

  • 使用以下命令更新网络参数:sgdmupdate.功能。

初始化培训进度情节。

如果阴谋==“培训 - 进展”图lineloSstrain =动画线('颜色',[0.85 0.325 0.098]); ylim([0 inf])xlabel(“迭代”)ylabel(“损失”)网格结尾

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

速度= [];

训练网络。

迭代=0;开始=抽搐;%循环epochs。为了epoch = 1:numepochs%洗牌数据。Shuffle(MBQ)%在小批量上循环。尽管hasdata(mbq)迭代=迭代+1;%读取小批量数据并将标签转换为虚拟%变量。[DLX,DLY] =下一个(MBQ);%评估模型渐变,状态和使用DLFeval和丢失%MapeSgrainers函数函数并更新网络状态。[梯度,状态,损失] = DLFeval(@ Maposgradients,Dlnet,DLX,DLY);dlnet.state = state;%使用SGDM优化器更新网络参数。[dlnet,速度]=sgdmupdate(dlnet,梯度,速度,学习率,动量);%显示培训进度。如果阴谋==“培训 - 进展”d =持续时间(0,0,toc(start),'格式''hh:mm:ss'); 添加点(lineLossTrain、迭代、双(聚集(提取数据(丢失)))标题(“时代:”+ epoch +“,经过:”+字符串(d))绘制结尾结尾结尾

测试模型

通过比较具有真标标签和角度的测试集的预测来测试模型的分类准确性。使用a管理测试数据集小公子具有与培训数据相同的对象。

[xtest,ytest] = digittest4darraydata;dsxtest = arraydataStore(xtest,“迭代维度”4);dsytest = ArrayDataStore(Yest);dstest =联合(dsxtest,dsytest);mbqtest = minibatchqueue(dstest,......'minibatchsize',小批量,......'minibatchfcn',@preprocessminibatch,......'minibatchformat',{'SSCB'''});

使用模型预测函数,在示例的末尾列出。该函数返回预测的类和与真值的比较。

[classesPredictions,classCorr]=模型预测(dlnet,mbqTest,classNames);

评估分类准确性。

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

模型梯度函数

MapicalGRADENTERS.函数作为输入a数据链路网络目的DLNET.和迷你批次输入数据DLX.具有相应的标签y,并返回关于学习参数的损失的渐变DLNET.,网络状态和丢失。要自动计算渐变,请使用梯度功能。

功能[渐变,状态,损失] = MapeStradients(DLNET,DLX,Y)[Dlypred,状态] =前进(DLNET,DLX);损失=联肾上腺素(Dlypred,Y);梯度= DLGRADIET(损失,DLNET.LEALNABLE);结尾

模型预测功能

模型预测函数作为输入a数据链路网络目的DLNET.A.小公子输入数据的处理mbq,并通过迭代中的所有数据来计算模型预测小公子。该功能使用onehotdecode.函数找到得分最高的预测类,然后将预测与真实类进行比较。该函数返回预测以及表示正确和错误预测的1和0向量。

功能[classesPredictions,classCorr]=模型预测(dlnet,mbq,classes)classesPredictions=[];classCorr=[];尽管Hasdata(MBQ)[DLX,DLY] =下一个(MBQ);%使用模型函数进行预测。dlypred =预测(Dlnet,DLX);%确定预测的类。YPredBatch=onehotdecode(dlYPred,类,1);classesPredictions=[classesPredictions YPredBatch];%比较预测和真实课程y = onehotdecode(dly,classes,1);classcorr = [classcorr ypredbatch == y];结尾结尾

小批量预处理函数

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

  1. 从传入的单元格数组中提取图像数据并连接到数字数组中。在第四维上串联图像数据会为每个图像添加第三维,用作单通道维。

  2. 从传入的单元格数组中提取标签数据,并沿第二维度连接到分类数组中。。

  3. 一种是将分类标签编码为数字数组。编码到第一维将生成一个编码数组,该数组与网络输出的形状相匹配。

功能[x,y] = preprocessminibatch(xcell,ycell)%从单元格中提取图像数据并连接X = CAT(4,Xcell {:});%从单元格中提取标签数据并连接y =猫(2,Ycell {:});%一个热编码标签y = onehotencode(y,1);结尾

也可以看看

|||||||||

相关话题