主要内容

dlnetwork

深入学习网络定制培训循环

描述

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

提示

对于大多数深度学习的任务,您可以使用一个pretrained网络和适应您自己的数据。为例展示如何使用转移学习再教育卷积神经网络分类一套新的图片,明白了火车深入学习网络对新图像进行分类。或者,您可以创建和培训网络从头开始使用layerGraph的对象trainNetworktrainingOptions功能。

如果trainingOptions功能不提供训练选项,你需要你的任务,你可以创建一个自定义训练循环使用自动分化。欲了解更多,请看为自定义训练循环定义深度学习网络

创建

描述

例子

dlnet= dlnetwork ()将在指定的网络层一个初始化dlnetwork对象代表一个深层神经网络用于自定义训练循环。可以是一个LayerGraph对象或一个数组中。必须包含一个输入层。

一个初始化dlnetwork对象为培训做好准备。可学的参数和状态的值dlnet与初始值初始化培训基于定义的输入规模网络输入层。

例子

dlnet= dlnetwork (,dlX1,…, dlXn)创建一个初始化dlnetwork对象使用示例输入dlX1,…, dlXn。可学的参数和状态的值dlnet与初始值初始化定义的基于输入的大小和格式输入示例。使用这个语法来创建一个初始化dlnetwork输入不连接到输入层。

例子

dlnet= dlnetwork (“初始化”,特遣部队)指定是否返回一个初始化或未初始化dlnetwork。使用这种语法创建一个未初始化的网络。

未初始化的网络设置,可学的空值和状态参数和不准备培训。你必须初始化未初始化dlnetwork您可以使用它之前。当您想要创建一个未初始化的网络延迟初始化以后。您可以使用未初始化的dlnetwork对象创建复杂的网络使用中间构件,然后连接在一起,例如,使用深入学习网络组成工作流。你可以初始化未初始化dlnetwork使用初始化函数。

dlnet= dlnetwork (___、“OutputNames”名称)还设置了OutputNames财产使用任何以前的语法。的OutputNames属性指定返回网络输出层。设置输出的名字,网络必须初始化。

输入参数

全部展开

网络层,指定为一个LayerGraph对象或作为一个数组中。

如果是一个数组,那么dlnetwork功能连接层系列。

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

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

网络输入,指定为格式化dlarray对象。软件通过网络传播示例的输入来确定适当的大小和格式的可学的和状态参数dlnetwork

输入必须格式化的例子dlarray对象。当是一个数组,在相同的顺序提供示例输入层中出现要求输入数组中。当是一个LayerGraph对象,提供示例输入层的顺序相同,需要输入中出现财产的LayerGraph

输入不支持当例子金宝app特遣部队是假的。

国旗返回初始化dlnetwork指定为一个数字或逻辑1(真正的)或0()。

如果特遣部队真正的1,可学的状态参数dlnet与初始值初始化培训,根据网络输入层或提供的示例输入。

如果特遣部队是假的,可习得和状态参数没有初始化。使用未初始化网络之前,您必须首先初始化它使用初始化函数。输入不支持当例子金宝app特遣部队是假的。

属性

全部展开

这个属性是只读的。

网络层,指定为一个数组中。

这个属性是只读的。

层连接,指定为一个表有两列。

每个表格行表示层的连接图。第一列,,指定每个连接的来源。第二列,目的地,指定每个连接的目的地。连接源和目的地是层名称或形式“layerName / IOName”,在那里“IOName”层的名称输入或输出。

数据类型:

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

  • ——层名称指定为一个字符串标量。

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

  • 价值——指定为一个参数的值dlarray对象。

网络可学的参数包含网络学习的特性。例如,卷积和完全连接层的权重。

数据类型:

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

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

  • ——层名称指定为一个字符串标量。

  • 参数——状态参数名称,指定为字符串标量。

  • 价值——指定为一个状态参数值dlarray对象。

层状态包含信息计算层操作期间被保留用于后续向前传球的层。例如,LSTM层的细胞状态和隐藏状态,或在批处理运行统计数据归一化层。

对复发性层,例如LSTM层,HasStateInputs属性设置为1(真正的),状态表不包含条目的状态的层。

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

数据类型:

这个属性是只读的。

网络输入层名称指定为一个单元阵列的特征向量。

数据类型:细胞

返回网络输出层,名称指定为一个单元阵列特征向量或一个字符串数组。

设置输出的名字,网络必须初始化。

如果你不指定输出的名字,然后软件设置OutputNames财产与断开输出层。如果一层有多个输出,然后断开输出被指定为“layerName / outputName”

预测向前函数,默认情况下,返回的输出的数据层OutputNames财产。

数据类型:细胞|字符串

这个属性是只读的。

为初始化网络,指定为0(虚假的)或1(真正的)。

如果初始化0(假),网络是没有初始化。必须初始化网络才能使用它。初始化网络使用初始化函数。

如果初始化1(真正的),初始化网络,可用于培训和推理。如果你改变可学的参数的值——例如,在训练的价值初始化仍然是1(真正的)。

数据类型:逻辑

对象的功能

预测 计算深度学习网络输出推理
向前 计算深度学习网络输出进行训练
初始化 可学的和状态参数进行初始化dlnetwork
layerGraph 图深度学习的网络层
setL2Factor L2的正则化因子层可学的参数设置
setLearnRateFactor 学习速率因子层可学的参数设置
getLearnRateFactor 得到学习速率因子层可学的参数
getL2Factor 得到了L2正则化因子层可学的参数

例子

全部折叠

实现一个自定义您的网络培训循环,首先将它转换成一个dlnetwork对象。不包括输出层dlnetwork对象。相反,您必须指定自定义训练循环中损失函数。

加载一个pretrained GoogLeNet模型使用googlenet函数。这个函数需要深度学习工具箱™模型GoogLeNet网络金宝app支持包。如果这种支持包没金宝app有安装,那么函数提供一个下载链接。

网= googlenet;

转换层的网络图和删除层用于分类使用removeLayers

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

网络转换为一个dlnetwork对象。

dlnet = dlnetwork (lgraph)
dlnet = dlnetwork属性:层:x1 nnet.cnn.layer.Layer[142]连接:[168 x2表]可学的:[116 x3表]状态:[0 x3表]InputNames:{“数据”}OutputNames: {“loss3-classifier”}初始化:1

使用输入示例创建一个多输入dlnetwork这是准备培训。软件通过网络传播示例的输入来确定适当的大小和格式的可学的和状态参数dlnetwork

定义网络体系结构。构建一个与两个分支网络。网络有两个输入,一个输入每个分支。连接分支使用附加层。

numFilters = 24;layersBranch1 = [convolution2dLayer (3、6 * numFilters,“填充”,“相同”,“步”2,“名字”,“conv1Branch1”)groupNormalizationLayer (所有渠道的)reluLayer convolution2dLayer (3 numFilters“填充”,“相同”)groupNormalizationLayer (“channel-wise”)additionLayer (2“名字”,“添加”)reluLayer fullyConnectedLayer (10) softmaxLayer];numFilters layersBranch2 = [convolution2dLayer (1,“名字”,“convBranch2”)groupNormalizationLayer (所有渠道的,“名字”,“gnBranch2”));lgraph = layerGraph (layersBranch1);lgraph = addLayers (lgraph layersBranch2);lgraph = connectLayers (lgraph,“gnBranch2”,“添加/ in2”);

创建示例网络相同大小的输入格式为典型的网络输入。为输入,使用批处理大小为32。使用一个输入的大小64 - - 64有三个渠道的输入层convBranch1。使用一个输入的大小64 -通过与18 - 64的输入渠道输入层convBranch2

dlX1 = dlarray(兰德([64 64 3 32]),“SSCB”);dlX2 = dlarray(兰德([32 32 18 32]),“SSCB”);

创建dlnetwork。提供的输入无关层出现在相同的顺序lgraph的属性。

dlnet = dlnetwork (lgraph dlX1 dlX2);

检查网络初始化并准备培训。

dlnet.Initialized
ans =逻辑1

这个例子展示了如何训练网络,把手写的数字和一个定制的学习速率的时间表。

如果trainingOptions不提供你需要的选项(例如,一个定制的学习速率的时间表),然后你可以定义自己的自定义训练循环使用自动分化。

这个例子列车网络分类手写数字的基于时间的衰减学习速率的时间表:对于每一次迭代,求解器使用的学习速率 ρ t = ρ 0 1 + k t ,在那里t是迭代数, ρ 0 最初的学习速率,k是衰减的。

负荷训练数据

数字数据加载图像数据存储使用imageDatastore功能和指定包含图像数据的文件夹。

dataFolder = fullfile (toolboxdir (“nnet”),“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,“IncludeSubfolders”,真的,“LabelSource”,“foldernames”);

分区数据为训练集和验证集。留出10%的验证使用的数据splitEachLabel函数。

[imdsTrain, imdsValidation] = splitEachLabel (imd, 0.9,“随机”);

在这个例子中使用的网络28-by-28-by-1需要输入图像的大小。自动调整训练图像,使用一个增强图像数据存储。指定额外增加操作执行培训图片:随机翻译5像素的图像在水平和垂直轴。数据增加有助于防止网络过度拟合和记忆的训练图像的细节。

inputSize = [28 28 1];pixelRange = 5 [5];imageAugmenter = imageDataAugmenter (“RandXTranslation”pixelRange,“RandYTranslation”,pixelRange);augimdsTrain = augmentedImageDatastore (inputSize (1:2), imdsTrain,“DataAugmentation”,imageAugmenter);

自动调整验证图像不执行进一步的数据,使用一个增强的图像数据存储不指定任何额外的预处理操作。

augimdsValidation = augmentedImageDatastore (inputSize (1:2), imdsValidation);

确定训练数据的类的数量。

类=类别(imdsTrain.Labels);numClasses =元素个数(类);

定义网络

定义网络图像分类。

层= [imageInputLayer inputSize,“归一化”,“没有”,“名字”,“输入”20岁的)convolution2dLayer (5“名字”,“conv1”)batchNormalizationLayer (“名字”,“bn1”)reluLayer (“名字”,“relu1”20岁的)convolution2dLayer (3“填充”,“相同”,“名字”,“conv2”)batchNormalizationLayer (“名字”,“bn2”)reluLayer (“名字”,“relu2”20岁的)convolution2dLayer (3“填充”,“相同”,“名字”,“conv3”)batchNormalizationLayer (“名字”,“bn3”)reluLayer (“名字”,“relu3”)fullyConnectedLayer (numClasses“名字”,“俱乐部”)softmaxLayer (“名字”,“softmax”));lgraph = layerGraph(层);

创建一个dlnetwork对象的层图。

dlnet = dlnetwork (lgraph)
dlnet = dlnetwork属性:层:[12×1 nnet.cnn.layer.Layer]连接:[11×2表]可学的:[14×3表]状态:[6×3表]InputNames:{“输入”}OutputNames: {“softmax”}

定义模型梯度函数

创建函数modelGradients上市的例子,需要一个dlnetwork对象,mini-batch输入数据与相应的标签和返回梯度的损失对网络中可学的参数和相应的损失。

指定培训选项

火车十世mini-batch大小为128。

numEpochs = 10;miniBatchSize = 128;

指定的选项个优化。指定一个初始学习衰变率0.01,0.01,0.9和动量。

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

火车模型

创建一个minibatchqueue对象流程和管理mini-batches图像在训练。为每个mini-batch:

  • 使用自定义mini-batch预处理功能preprocessMiniBatch(在这个例子中定义)转换编码的标签在一个炎热的变量。

  • 格式的图像数据维度标签“SSCB”(空间、空间、通道、批)。默认情况下,minibatchqueue把数据转换为对象dlarray对象与基本类型。不格式添加到类的标签。

  • 火车在GPU如果一个是可用的。默认情况下,minibatchqueue将每个输出转换为对象gpuArray如果一个GPU是可用的。使用GPU需要并行计算工具箱™和支持GPU设备。金宝app支持设备的信息,请参阅金宝appGPU的金宝app支持版本(并行计算工具箱)

兆贝可= minibatchqueue (augimdsTrain,“MiniBatchSize”miniBatchSize,“MiniBatchFcn”@preprocessMiniBatch,“MiniBatchFormat”,{“SSCB”,});

初始化培训进展阴谋。

图lineLossTrain = animatedline (“颜色”[0.85 0.325 0.098]);ylim([0正])包含(“迭代”)ylabel (“损失”网格)

个解算器初始化速度参数。

速度= [];

列车网络使用自定义训练循环。对于每一个时代,洗牌和遍历mini-batches数据的数据。为每个mini-batch:

  • 评估模型的梯度、州和使用dlfevalmodelGradients功能和更新网络状态。

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

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

  • 显示培训进展。

迭代= 0;开始=抽搐;%循环时期。时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);%在mini-batches循环。hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。[dlX,海底]=下一个(兆贝可);%评估模型梯度、州和使用dlfeval和损失% modelGradients功能和更新网络状态。(渐变、州损失)= dlfeval (@modelGradients, dlnet dlX,海底);dlnet。状态=state;%确定为基于时间的学习速率衰减学习速率的时间表。learnRate = initialLearnRate /(1 +衰变*迭代);%更新使用个优化网络参数。[dlnet,速度]= sgdmupdate (dlnet、渐变速度,learnRate动量);%显示培训进展。D =持续时间(0,0,toc(开始),“格式”,“hh: mm: ss”);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+时代+”,过去:“+ drawnow字符串(D))结束结束

测试模型

测试模型的分类精度比较预测验证集和真正的标签。

训练后,使预测新数据不需要标签。创建minibatchqueue对象只包含测试数据的预测:

  • 忽略标签测试,设置输出的数量mini-batch队列1。

  • 指定相同的mini-batch大小用于培训。

  • 预处理预测使用preprocessMiniBatchPredictors函数,列出的例子。

  • 对于单一的输出数据存储,指定mini-batch格式“SSCB”(空间、空间、通道、批)。

numOutputs = 1;mbqTest = minibatchqueue (augimdsValidation numOutputs,“MiniBatchSize”miniBatchSize,“MiniBatchFcn”@preprocessMiniBatchPredictors,“MiniBatchFormat”,“SSCB”);

使用循环mini-batches和分类图像modelPredictions函数,列出的例子。

预测= modelPredictions (dlnet、mbqTest、类);

评估分类精度。

欧美= imdsValidation.Labels;= =次精度=意味着(预测)
精度= 0.9530

模型梯度函数

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

函数(渐变、州损失)= modelGradients (dlnet dlX Y) [dlYPred、州]=向前(dlnet dlX);损失= crossentropy (dlYPred Y);梯度= dlgradient(损失、dlnet.Learnables);损失=双(收集(extractdata(损失)));结束

模型的预测函数

modelPredictions函数接受一个dlnetwork对象dlnet,一个minibatchqueue的输入数据兆贝可网络类,计算模型遍历所有数据的预测minibatchqueue对象。这个函数使用onehotdecode函数找到预测类最高的分数。

函数预测= modelPredictions (dlnet、兆贝可类)预测= [];hasdata(兆贝可)dlXTest =下一个(兆贝可);dlYPred =预测(dlnet dlXTest);YPred = onehotdecode (dlYPred、类1)';预测=[预测;YPred];结束结束

小批预处理功能

preprocessMiniBatch函数进行预处理的mini-batch预测和标签使用以下步骤:

  1. 使用预处理的图像preprocessMiniBatchPredictors函数。

  2. 从传入单元阵列提取标签数据和连接到一个直言沿着二维数组。

  3. 一个炎热的分类标签编码成数字数组。编码的第一个维度产生一个相匹配的形状编码阵列网络输出。

函数(X, Y) = preprocessMiniBatch(伊势亚YCell)%预处理预测。X = preprocessMiniBatchPredictors(伊势亚);%从细胞中提取标签数据和连接。Y =猫(2,YCell{1:结束});%一个炎热的编码标签。Y, Y = onehotencode (1);结束

Mini-Batch预测预处理功能

preprocessMiniBatchPredictors函数进行预处理mini-batch预测因子的提取图像数据从输入单元阵列和连接到一个数字数组。灰度输入,连接在第四维度添加每个图像的三维空间,作为一个单通道维度。

函数X = preprocessMiniBatchPredictors(伊势亚)%连接。猫(X = 4,伊势亚{1:结束});结束

加载一个pretrained网络。

网= squeezenet;

转换层的网络图,把输出层,将它转换成一个dlnetwork对象。

lgraph = layerGraph(净);lgraph = removeLayers (lgraph,“ClassificationLayer_predictions”);dlnet = dlnetwork (lgraph);

可学的财产的dlnetwork对象是一个包含网络的可学的参数表。嵌套层的表包括参数在不同的行。查看可学的表的前几行。

可学的= dlnet.Learnables;头(可学的)
ans =8×3表层参数值_____________ _____ ___________________“conv1”“权重”{3 x3x3x64 dlarray}“conv1”“偏见”{1 x1x64 dlarray}“fire2-squeeze1x1”“权重”{1 x1x64x16 dlarray}“fire2-squeeze1x1”“偏见”{1 x1x16 dlarray}“fire2-expand1x1”“权重”{1 x1x16x64 dlarray}“fire2-expand1x1”“偏见”{1 x1x64 dlarray}“fire2-expand3x3”“权重”{3 x3x16x64 dlarray}“fire2-expand3x3”“偏见”{1 x1x64 dlarray}

冻结的可学的参数网络,遍历可学的参数和设置率为0使用学习setLearnRateFactor函数。

因素= 0;numLearnables =大小(可学的,1);i = 1: numLearnables layerName = learnables.Layer(我);parameterName = learnables.Parameter(我);dlnet = setLearnRateFactor (dlnet, layerName、parameterName因素);结束

培训时使用更新后的学习速率的因素,你必须通过dlnetwork对象更新函数自定义训练循环。例如,使用命令

[dlnet、速度]= sgdmupdate (dlnet、渐变速度);

创建一个未初始化的dlnetwork对象没有一个输入层。创建一个未初始化的dlnetwork是有用的,当你还不知道网络的大小和格式输入,例如,当dlnetwork是嵌套在一个自定义层。

定义网络层。这个网络有一个输入,这不是连接到输入层。

20层= [convolution2dLayer (5) batchNormalizationLayer reluLayer fullyConnectedLayer (10) softmaxLayer);

创建一个未初始化的dlnetwork。设置初始化选项

dlnet = dlnetwork(层,“初始化”、假);

检查网络是否没有初始化。

dlnet.Initialized
ans =逻辑0

这个网络的可学的和状态参数不初始化培训。初始化网络,使用初始化函数。

如果你想使用dlnet直接在一个定制的训练循环,然后你可以通过使用初始化它初始化输入功能和提供一个例子。

如果你想使用dlnet自定义层内,然后你可以利用自动初始化。如果您使用自定义层内dlnetwork,然后dlnet初始化时父母吗dlnetwork构造(或父网络初始化时如果是构造成未初始化dlnetwork)。如果您使用自定义层内部的网络训练使用trainNetwork函数,那么dlnet在训练时间自动初始化。有关更多信息,请参见深入学习网络组成

更多关于

全部展开

兼容性的考虑

全部展开

扩展功能

介绍了R2019b