dlnetwork

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

描述

一个dlnetwork对象支持使用自动微分实现自定义金宝app训练循环。

提示

对于大多数深学习任务,你可以使用预训练网络,并使其适应自己的数据。有关说明如何使用传输学习再培训卷积神经网络,一组新的图片进行分类示例,请参见训练深度学习网络对新图像进行分类。或者,您可以使用以下工具从零开始创建和训练网络layerGraph的对象trainNetworktrainingOptions功能。

如果trainingOptions功能不提供培训选项,你需要为你的任务,那么你可以创建一个使用自动分化定制培训圈。要了解更多信息,请参阅定义自定义训练循环

创建

描述

例子

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

输入参数

展开全部

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

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

对于由支持层的列表金宝appdlnetwork,请参阅金宝app支持层

属性

展开全部

网络层,指定为数组中。

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

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

数据类型:表格

网络可以学习的参数,指定为三列的表格:

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

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

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

该网络可以学习的参数包含在网络上了解到的特征。例如,卷积的权重和完全连接层。

数据类型:表格

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

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

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

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

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

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

在培训过程中或推断,您可以使用更新的输出网络状态向前预测功能。

数据类型:表格

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

数据类型:细胞

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

数据类型:细胞

对象的功能

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

例子

全部折叠

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

使用。加载预训练的GoogLeNet模型googlenet函数。此函数需要深度学习工具箱™模型GoogLeNet网络金宝app支持包。如果未安装此支持金宝app包,则该功能提供了下载链接。

净= 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([28281]),“名字”,“输入”,“的意思是”,表示(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)
[11×2表]连接:[14×3表]状态:[6×3表]输入名:{'input'}输出名:{'softmax'}

定义模型梯度函数

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

指定培训选项

以128个小批量训练5个纪元。

numEpochs = 5;miniBatchSize = 128;

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

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

将训练过程形象化。

情节=“训练进度”;

在GPU上训练(如果有的话)。使用GPU需要并行计算工具箱™和CUDA®启用NVIDIA®GPU计算能力3.0或更高。

executionEnvironment =“汽车”;

火车模型

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

对于每个epoch,重新洗牌数据并循环小批量数据。在每个epoch结束时,显示训练进度。

为每个mini-batch:

  • 将标签转换为虚拟变量。

  • 将数据转换为dlarray对象,并指定维度标签'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(numel(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。如果(执行环境==“汽车”&& canUseGPU) ||执行环境==“图形”DLX = gpuArray(DLX);结束%使用dlfeval和%modelGradients功能和更新网络状态。(渐变、州损失)= dlfeval (@modelGradients, dlnet dlX Y);dlnet。状态=state;%确定学习率基于时间的衰减率的学习进度。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');如果(执行环境==“汽车”&& 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函数。

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

模型的预测函数

modelPredictions函数接受一个dlnetwork对象dlnet,输入数据的数组dlX,和迷你批量大小,并且输出通过遍历指定大小的小型分批模型预测。

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

更多关于

展开全部

介绍了R2019b