向前

计算深度学习网络输出用于训练

描述

一些深度学习层在训练和推断(预测)时表现不同。例如,在训练过程中,dropout层将输入元素随机设置为零,以帮助防止过拟合,但在推理过程中,dropout层并不更改输入。

要计算用于训练的网络输出,请使用向前函数。要计算用于推理的网络输出,请使用预测函数。

例子

海底= (dlnet,dlX)返回网络输出海底在培训期间给定输入数据dlX

海底= (dlnet、dlX1 dlXM……)返回网络输出海底在培训期间输入dlX1,…, dlXM和网络dlnet输入和单个输出。

[dlY1,…,dlYN]= (___)返回N输出dlY1、……dlYN在培训网络的时候N使用任何以前的语法输出。

[dlY1,…,dlYK]= (___“输出”,layerNames)返回输出dlY1、……dlYK在使用前面的任何语法训练指定的层时。

(___,状态]= (___)还使用以前的任何语法返回更新后的网络状态。

例子

全部折叠

这个例子展示了如何训练一个使用自定义学习率时间表对手写数字进行分类的网络。

如果trainingOptions不提供您需要的选项(例如,自定义学习率计划),那么您可以使用自动区分来定义您自己的自定义训练循环。

这个例子训练了一个网络来分类手写数字基于时间的衰减学习率时间表:对于每次迭代,求解器使用给定的学习率 ρ t = ρ 0 1 + k t ,在那里t为迭代次数, ρ 0 初始学习率是多少k是衰减的。

负荷训练数据

加载数字数据。

[XTrain, YTrain] = digitTrain4DArrayData;类=类别(YTrain);numClasses =元素个数(类);

定义网络

属性定义网络并指定平均映像“的意思是”选项在图像输入层。

[imageInputLayer([28 28 1]),“名字”,“输入”,“的意思是”, mean(XTrain,4))卷积2dlayer (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)
可学习表:[14×3表]状态:[6×3表]InputNames: {'input'} OutputNames: {'softmax'}

定义模型梯度函数

创建函数modelGradients,在示例的最后列出,它采用dlnetwork对象dlnet,一小批输入数据dlX与相应的标签Y并返回关于可学习参数的损失的梯度dlnet以及相应的损失。

指定培训选项

火车与一个小批量的128为5个epoch。

numEpochs = 5;miniBatchSize = 128;

为SGDM优化指定选项。指定初始学习率为0.01,衰减为0.01,动量为0.9。

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

在一个情节中可视化训练进程。

情节=“训练进步”;

如果有的话,在GPU上进行训练。使用GPU需要Parallel Computing Toolbox™和支持CUDA®的NVIDIA®GPU,计算能力为3.0或更高。

executionEnvironment =“汽车”;

火车模型

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

对于每个纪元,洗牌数据和循环数据的小批。在每个阶段结束时,显示训练进度。

为每个mini-batch:

  • 将标签转换为哑变量。

  • 将数据转换为dlarray对象的基础类型为single,并指定维度标签“SSCB”(空间、空间、通道、批处理)

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

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

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

  • 属性更新网络参数sgdmupdate函数。

初始化训练进度图。

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

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

速度= [];

培训网络。

numObservations =元素个数(YTrain);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);迭代= 0;开始=抽搐;循环周期。时代= 1:numEpochs%洗牌数据。idx = randperm(元素个数(YTrain));XTrain = XTrain (:,:,:, idx);YTrain = YTrain (idx);在小批中循环。i = 1:numIterationsPerEpoch iteration = iteration + 1;%读取小批数据,并将标签转换为假的%变量。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);(numClasses, miniBatchSize,“单一”);1:numClasses Y(c,YTrain(idx))==classes(c)) = 1;结束%转换小批数据到dlarray。dlX = dlarray(单(X),“SSCB”);在GPU上进行训练,然后将数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) b| executionEnvironment ==“图形”dlX = gpuArray (dlX);结束%使用dlfeval和the评估模型梯度、状态和损失% modelGradients函数和更新网络状态。(渐变、州损失)= dlfeval (@modelGradients, dlnet dlX Y);dlnet。状态=状态;%确定基于时间的衰减学习速率计划的学习速率。learnRate = initialLearnRate/(1 +衰变*迭代);%使用SGDM优化器更新网络参数。[dlnet, velocity] = sgdmupdate(dlnet, gradient, velocity, learnRate, momentum);显示训练进度。如果情节= =“训练进步”D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、双(收集(extractdata(损失))))标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束

测试模型

通过比较测试集上的预测值和真实标签来测试模型的分类精度。

[XTest, YTest] = digitTest4DArrayData;

将数据转换为dlarray具有尺寸格式的对象“SSCB”。对于GPU预测,也转换数据到gpuArray

dlXTest = dlarray (XTest,“SSCB”);如果(executionEnvironment = =“汽车”&& canUseGPU) b| executionEnvironment ==“图形”dlXTest = gpuArray (dlXTest);结束

使用以下方法对图像进行分类modelPredictions函数,并在示例的最后列出,查找得分最高的类。

dlYPred = modelPredictions (dlnet dlXTest miniBatchSize);[~,idx] = max (extractdata (dlYPred), [], 1);YPred =类(idx);

评估分类精度。

准确度=均值(YPred == YTest)
精度= 0.9910

模型梯度函数

modelGradients函数接受一个dlnetwork对象dlnet,一小批输入数据dlX与相应的标签Y并返回关于可学习参数的损失的梯度dlnet,网络状态,和损失。要自动计算梯度,请使用dlgradient函数。

函数[gradient,state,loss] = modelGradients(dlnet,dlX,Y) [dlYPred,state] = forward(dlnet,dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);结束

模型的预测函数

modelPredictions函数接受一个dlnetwork对象dlnet,输入数据数组dlX,并通过遍历指定大小的微型批处理输出模型预测。

函数numObservations = size(dlX,4);numiteration = ceil(numObservations / miniBatchSize);numClasses = dlnet.Layers .OutputSize (11);dlYPred = 0 (numClasses numObservations,“喜欢”dlX);i = 1:numIterations idx = (i-1)*miniBatchSize+1:min(i*miniBatchSize,numObservations);dlYPred (:, idx) =预测(dlnet, dlX (:,:,:, idx));结束结束

输入参数

全部折叠

网络的自定义训练循环,指定为dlnetwork对象。

输入数据,指定为格式化dlarray。有关dlarray格式,请参见fmt输入参数的dlarray

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

  • 如果layerNames(我)对应一个具有单个输出的层,然后layerNames(我)是层的名称。

  • 如果layerNames(我)对应具有多个输出的层,则layerNames(我)是层名后跟字符"/和输出的图层名称:“layerName / outputName”

输出参数

全部折叠

输出数据,作为格式化返回dlarray。有关dlarray格式,请参见fmt输入参数的dlarray

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

网络状态是一个有三列的表:

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

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

  • 价值-参数的值,指定为数值数组对象。

网络状态包含迭代之间由网络记住的信息。例如,LSTM和批处理规范化层的状态。

更新a的状态dlnetwork使用状态财产。

扩展功能

介绍了R2019b