前锋

计算深学习培训网络输出

描述

一些深层次的学习培训层和推断(预测)期间表现不同。例如,在训练期间,辍学层随机设定输入元素为零,以帮助防止过度拟合,但推理过程中,辍学层不会改变输入。

为了计算网络输出,用于培训,使用前锋功能。为了计算网络输出,用于推断,使用预测功能。

DLY=正向(dlnetDLX返回网络输出DLY培训期间给予的输入数据DLX

DLY=正向(dlnet,dlX1,...,dlXM)返回网络输出DLY培训期间给予的中号输入dlX1,...,dlXM和网络dlnet中号输入和单个输出。

[DLY1,...,dlYN] =正向(___返回ñ输出DLY1,...,dlYN对于具有网络训练中ñ使用任何先前的语法的输出。

[DLY1,...,dlYK] =正向(___, '输出',layerNames返回的输出DLY1,...,dlYK使用如前述语法的指定的层在训练期间。

[___] =正向(___也返回使用任何以前的语法的更新网络状态。

例子

全部收缩

这个例子显示了如何培养一个网络,以进行分类定制学习费率表手写的数字。

如果trainingOptions不提供您需要的选项(比如,一个定制的学习费率表),那么你可以使用自动微分定义自己的训练循环。

这个例子训练的网络与手写数字进行分类基于时间的衰减学习速率时间表:对于每次迭代求解器使用由给定的学习率 ρ Ť = ρ 0 1 + ķ Ť ,其中Ť是迭代次数, ρ 0 是初始学习率,ķ是衰减。

负荷训练数据

加载数字数据。

[XTrain,YTrain] = digitTrain4DArrayData;类=类别(YTrain);numClasses = numel(类);

定义网络

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

层= [imageInputLayer([28 28 1],'名称'“输入”'意思',平均(XTrain,4))convolution2dLayer(5,20,'名称''CONV1')batchNormalizationLayer('名称''BN1')reluLayer('名称''relu1')convolution2dLayer(3,20,'填充'1,'名称''CONV2')batchNormalizationLayer('名称''BN2')reluLayer('名称''relu2')convolution2dLayer(3,20,'填充'1,'名称''conv3')batchNormalizationLayer('名称''BN3')reluLayer('名称''relu3')fullyConnectedLayer(numClasses,'名称''FC')softmaxLayer('名称''SOFTMAX')];lgraph = layerGraph(层);

创建一个dlnetwork从该层图形对象。

dlnet = dlnetwork(lgraph)
dlnet = dlnetwork与属性:层:[12×1 nnet.cnn.layer.Layer]连接:[11×2表] Learnables:[14×3表]状态:[6×3表] InputNames:{ '输入'} OutputNames:{ 'SOFTMAX'}

定义模式渐变功能

创建功能modelGradients在该示例的末尾列出的,采用一个dlnetwork目的dlnet中,小批量的输入数据的DLX与相应的标签ÿ并返回损失的梯度相对于所述可学习参数在dlnet和相应的损耗。

指定培训选项

用的128 5个历元一个minibatch大小训练。

numEpochs = 5;miniBatchSize = 128;

指定SGDM优化的选项。以0.01的衰减和动量0.9指定的0.01的初始学习率。

initialLearnRate = 0.01;衰变= 0.01;动量= 0.9;

在可视化情节的训练进度。

地块=“训练进度”;

在GPU上火车(如果可用)。使用GPU需要并行计算工具箱™和启用CUDA®GPUNVIDIA®计算能力3.0或更高版本。

执行环境=“汽车”;

火车模型

培养使用自定义的训练循环模型。

对于每一个时代,洗牌对数据的小批量数据和循环。在每个历元的端部,显示训练进度。

对于每个小批量:

  • 转换的标签,以虚拟变量。

  • 转换的数据dlarray有基础型单对象,并指定尺寸的标签'SSCB'(空间,空间信道,批次)。

  • 对于GPU训练,转换成gpuArray对象。

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

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

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

初始化训练进度情节。

如果地块==“训练进度”图lineLossTrain = animatedline('颜色',[0.85 0.325 0.098]);ylim([0 INF])xlabel(“迭代”)ylabel(“失利”)网格结束

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

速度= [];

训练网络。

numObservations = numel(YTrain);numIterationsPerEpoch =地板(numObservations./miniBatchSize);迭代= 0;开始=抽动;%遍历时期。对于历元= 1:numEpochs%随机数据。IDX = randperm(numel(YTrain));XTrain = XTrain(:,:,:,IDX);YTrain = YTrain(IDX);%遍历迷你批次。对于I = 1:numIterationsPerEpoch迭代=迭代+ 1;数据的读%小批量和转换标签哑%变量。IDX =(I-1)* miniBatchSize + 1:我* miniBatchSize;X = XTrain(:,:,:,IDX);Y =零(numClasses,miniBatchSize,'单');对于C = 1:numClasses Y(C,YTrain(IDX)==类(C))= 1;结束%转换小批量数据的dlarray。DLX = dlarray(单(X),'SSCB');%如果在GPU训练,然后数据转换为gpuArray。如果(执行环境==“汽车”&& canUseGPU)||执行环境==“GPU”DLX = gpuArray(DLX);结束%评估模型梯度,状态和使用损失dlfeval和%modelGradients功能和更新网络状态。[梯度,状态,损失] = dlfeval(@ modelGradients,dlnet,DLX,Y);dlnet.State =状态;%确定学习率基于时间的衰减率的学习进度。learnRate = initialLearnRate /(1 +衰变*迭代);%更新使用SGDM优化网络参数。[dlnet,速度] = sgdmupdate(dlnet,梯度,速度,learnRate,动量);%显示训练进度。如果地块==“训练进度”d =持续时间(0,0,TOC(开始),'格式''HH:MM:SS');addpoints(lineLossTrain,迭代,双(聚(ExtractData由(亏损))))标题(“时代”+划时代+“消逝”+串(d))的DrawNow结束结束结束

测试模型

通过在测试集与真标签的预测比较测试模型的分类精度。

[XTEST,YTest] = digitTest4DArrayData;

转换数据到dlarray与尺寸格式对象'SSCB'。对于GPU的预测,也将数据转换成gpuArray

dlXTest = dlarray(XTEST,'SSCB');如果(执行环境==“汽车”&& canUseGPU)||执行环境==“GPU”dlXTest = gpuArray(dlXTest);结束

使用分类的图像modelPredictions工作,在本例的最后列出,并找到得分最高的类。

dlYPred = modelPredictions(dlnet,dlXTest,miniBatchSize);[〜,IDX] = MAX(ExtractData由(dlYPred),[],1);YPred =类(IDX);

评估分类精度。

精度=平均值(YPred == YTest)
精度= 0.9910

型号渐变功能

modelGradients功能需要dlnetwork目的dlnet中,小批量的输入数据的DLX与相应的标签ÿ并返回损失的梯度相对于所述可学习参数在dlnet,网络状态和损失。自动计算梯度,使用dlgradient功能。

功能[梯度,状态,损失] = modelGradients(dlnet,DLX,Y)[dlYPred,状态] =向前(dlnet,DLX);损耗= crossentropy(dlYPred,Y);梯度= dlgradient(损失,dlnet.Learnables);结束

模型预测功能

modelPredictions功能需要dlnetwork目的dlnet中,输入数据的数组DLX,和迷你批量大小,并且输出通过遍历指定大小的小型分批模型预测。

功能dlYPred = modelPredictions(dlnet,DLX,miniBatchSize)numObservations =尺寸(DLX,4);numIterations =小区(numObservations / miniBatchSize);numClasses = dlnet.Layers(11).OutputSize;dlYPred =零(numClasses,numObservations,'喜欢',DLX);对于I = 1:numIterations IDX =(I-1)* miniBatchSize + 1:分钟(I * miniBatchSize,numObservations);dlYPred(:,IDX)=预测(dlnet,DLX(:,:,:,IDX));结束结束

输入参数

全部收缩

网络的定制培训的循环,指定为dlnetwork目的。

输入数据,指定为格式化dlarray。有关详细信息dlarray格式见FMT的输入参数dlarray

层,以提取输出,指定为字符串数组或含有该层的名称字符向量的单元阵列。

  • 如果layerNames(ⅰ)对应于层结合单输出,然后layerNames(ⅰ)是该层的名称。

  • 如果layerNames(ⅰ)对应于具有多个输出,则层layerNames(ⅰ)在层名后面的字符“/“与输出层的名称:'layerName / outputName'

输出参数

全部收缩

输出数据,返回作为格式化的dlarray。有关详细信息dlarray格式见FMT的输入参数dlarray

更新后的网络状态,返回表。

网络状态为一个三列的表:

  • - 图层名称,指定为字符串标量。

  • 参数- 参数名称,指定为字符串标量。

  • - 参数的值,指定为数字阵列对象。

网络状态包含迭代之间的网络学习信息。例如,LSTM和批标准化层的状态。

更新的状态dlnetwork使用属性。

扩展功能

介绍了在R2019b