dlnetwork

用于自定义训练循环的深度学习网络

描述

一个dlnetwork对象能够使用自动分化定制培训圈万博1manbetx的支持。

提示

对于大多数深度学习任务,您可以使用一个预先训练好的网络,并根据您自己的数据进行调整。有关如何使用传输学习重新训练卷积神经网络对新图像进行分类的示例,请参见火车深学习网络分类新形象。或者,你可以创建和使用从头开始培训网络layerGraph的对象trainNetworktrainingOptions功能。

如果trainingOptions函数不提供任务所需的训练选项,然后可以使用自动区分创建自定义训练循环。想了解更多,请看定义自定义训练循环

创建

描述

例子

dlnet= dlnetwork (lgraph)将层图转换为dlnetwork对象表示用于自定义训练循环的深度神经网络。

输入参数

全部展开

网络架构,指定为一个层图。

层图必须不包含输出层。训练网络时,分别计算损失。

支持的层的列表万博1manbetxdlnetwork,请参阅万博1manbetx支持图层

属性

全部展开

网络层,指定为数组中。

层连接,指定为具有两列的表。

每个表行表示层图中的一个连接。第一列,资源中,指定各个连接的源。第二列,目的地,指定每个连接的目标。连接源和目标要么是层名称,要么是表单“layerName / IOName”,在那里'IOName'是层输入或输出的名称。

数据类型:表格

网络可学习参数,指定为一个具有三列的表:

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

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

  • 价值-参数的值,指定为adlarray

网络可学习参数包含了网络学习的特征。例如,卷积和全连通层的权值。

数据类型:表格

网络状态,指定为一个表。

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

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

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

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

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

在训练或推理期间,可以使用的输出更新网络状态向前预测功能。

数据类型:表格

网络输入层名称,指定为字符向量的单元数组。

数据类型:细胞

网络输出层名称,指定为单元数组的字符向量。此属性包括具有断开连接的输出的所有层。如果一个层有多个输出,则断开连接的输出被指定为'layerName / outputName'

数据类型:细胞

对象的功能

向前 计算深学习培训网络输出
预测 计算用于推理的深度学习网络输出
layerGraph 用于深度学习的网络层图

例子

全部折叠

要为您的网络实现自定义训练循环,首先将其转换为dlnetwork对象。在?中不包括输出层dlnetwork对象。相反,您必须在自定义训练循环中指定loss函数。

使用加载预训练GoogLeNet模型googlenet函数。此函数需要深度学习工具箱模型GoogLeNet网络万博1manbetx支持包。如果未安装此支持万博1manbetx包,则该函数提供下载链接。

网= googlenet;

将网络转换为层图,并删除用于分类的层removeLayers

lgraph = layerGraph(净);lgraph = removeLayers (lgraph, (“概率”“输出”]);

转换网络的dlnetwork对象。

dlnet = dlnetwork (lgraph)
[168x2 table] . Learnables: [116x3 table] State: [0x3 table] InputNames: {'data'} OutputNames: {'loss3-classifier'}

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

如果trainingOptions不提供所需的选项(例如,自定义学习速率计划),则可以使用自动微分定义自己的自定义训练循环。

此示例训练网络使用。对手写数字进行分类基于时间的衰减学习率调度:对于每个迭代,求解器使用给定的学习率 ρ t = ρ 0 1 + k t ,在那里t为迭代次数, ρ 0 为初始学习率,k是衰减的。

负荷训练数据

加载数字数据。

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

定义网络

方法定义网络并指定平均映像'意思'选项,在图像输入层。

层= [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“名字”,“俱乐部”)softmaxLayer (“名字”,“softmax”));lgraph = layerGraph(层);

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

dlnet = dlnetwork (lgraph)
[11×2表格]. Learnables:[14×3表格]State:[6×3表格]InputNames: {'input'} OutputNames: {'softmax'}

定义模式渐变功能

创建函数modelGradients,列在例子的最后,它取adlnetwork对象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需要并行计算工具箱™和启用CUDA®GPUNVIDIA®计算能力3.0或更高版本。

executionEnvironment =“汽车”;

火车模型

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

对于每个epoch,重新洗牌数据并在小批数据上进行循环。在每个epoch的末尾,显示训练进度。

为每个mini-batch:

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

  • 转换的数据dlarray具有基础类型single的对象,并指定维度标签“SSCB”(空间,空间,渠道,批)。

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

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

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

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

初始化训练进度图。

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

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

速度= [];

培训网络。

numObservations =元素个数(YTrain);numIterationsPerEpoch =地板(numObservations. / miniBatchSize);迭代= 0;开始=抽搐;循环超过epoch。时代= 1:numEpochs%洗牌数据。idx = randperm(元素个数(YTrain));XTrain = XTrain (:,:,:, idx);YTrain = YTrain (idx);对小批进行循环。i = 1:numIterationsPerEpoch iteration = iteration + 1;读取小批数据并将标签转换为哑标签%变量。idx =(张)* miniBatchSize + 1:我* miniBatchSize;X = XTrain (:,:,:, idx);Y = 0 (numClasses, miniBatchSize,“单一”);c = 1:numClasses Y(c,YTrain(idx)==classes(c)) = 1;结束%转换小批量数据的dlarray。dlX = dlarray(单(X),“SSCB”);%如果在GPU训练,然后数据转换为gpuArray。如果(executionEnvironment = =“汽车”&& canUseGPU) ||执行环境==“图形”dlX = gpuArray (dlX);结束%使用dlfeval和the评估模型梯度、状态和损失% 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(损失))))标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束结束

测试模型

通过比较测试集上的预测与真实标签来测试模型的分类准确性。

[XTEST,YTest] = digitTest4DArrayData;

将数据转换为adlarray与尺寸格式对象“SSCB”。对于GPU的预测,也可以将数据转换为gpuArray

dlXTest = dlarray (XTest,“SSCB”);如果(executionEnvironment = =“汽车”&& canUseGPU) ||执行环境==“图形”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函数。

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

模型的预测函数

modelPredictions功能需要dlnetwork对象dlnet中,输入数据的数组dlX,以及一个迷你批大小,并通过迭代指定大小的迷你批来输出模型预测。

函数dlYPred = model(dlnet,dlX,miniBatchSize) 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:分钟(I * miniBatchSize,numObservations);dlYPred(:,IDX)=预测(dlnet,DLX(:,:,:,IDX));结束结束

更多关于

全部展开

介绍了R2019b