主要内容

dlnetwork

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

描述

一个dlnetwork对象支持自定义训练循环使用自动万博1manbetx分化。

提示

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

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

创建

描述

例子

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

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

例子

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

例子

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

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

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

= dlnetwork (prunableNet)删除过滤器选择从卷积的修剪prunableNet并返回一个压缩dlnetwork对象可学的参数较少,规模较小。

修剪深神经网络,你需要深度学习工具箱™模型量化图书馆万博1manbetx支持包。这种支持包万博1manbetx是一个免费的插件,你可以下载使用附加Explorer。另外,看到深度学习工具箱量化模型库

输入参数

全部展开

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

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

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

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

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

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

输入不支持当例子万博1manbetx特遣部队是假的。

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

如果特遣部队1,然后软件初始化可学的状态参数与初始值进行训练,根据网络输入层或提供的示例输入。

如果特遣部队0软件没有初始化,那么可学的和状态参数。使用未初始化网络之前,您必须首先初始化它使用初始化函数。输入不支持当例子万博1manbetx特遣部队是假的。

网络修剪利用一阶泰勒近似,指定为一个TaylorPrunableNetwork对象。

属性

全部展开

这个属性是只读的。

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

这个属性是只读的。

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

每个表格行表示层的连接图。第一列,,指定每个连接的来源。第二列,目的地,指定每个连接的目的地。连接源和目的地是层名称或形式“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正则化因子层可学的参数
resetState 重置状态参数的神经网络

例子

全部折叠

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

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

网= 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

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

你可以训练使用的大多数类型的神经网络trainNetworktrainingOptions功能。如果trainingOptions函数不提供你需要的选项(例如,一个定制的学习速率的时间表),然后你可以定义自己的自定义训练循环使用dlarraydlnetwork对象自动分化。为一个例子,演示如何培训pretrained深学习网络使用trainNetwork功能,请参阅学习使用Pretrained网络传输

训练一个深层神经网络是一种优化的任务。通过考虑一个神经网络作为一个函数 f ( X ; θ ) ,在那里 X 网络的输入, θ 可学的参数集,您可以优化吗 θ 减少一些损失值基于训练数据。例如,优化可学的参数 θ 这样,对于一个给定的输入 X 与相应的目标 T ,他们之间的误差最小化预测 Y = f ( X ; θ ) T

取决于使用的损失函数类型的任务。例如:

  • 对于分类任务,您可以最小化之间的交叉熵误差预测和目标。

  • 对于回归的任务,您可以最小化之间的均方误差预测和目标。

您可以使用梯度下降优化目标:最小化损失 l 通过迭代更新可学的参数 θ 通过采取措施对最小使用渐变的损失对可学的参数。梯度下降算法更新可学的参数通常使用的更新一步的变体形式 θ t + 1 = θ t - - - - - - ρ l ,在那里 t 是迭代数, ρ 是学习速率, l 表示渐变(衍生品的损失对可学的参数)。

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

负荷训练数据

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

dataFolder = fullfile (toolboxdir (“nnet”),“nndemos”,“nndatasets”,“DigitDataset”);imd = imageDatastore (dataFolder,IncludeSubfolders = true,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 =元素个数(类);

定义网络

定义网络图像分类。

  • 图像输入,指定一个图像输入层与输入训练数据匹配的大小。

  • 不正常的图像输入,设置归一化选择输入层“没有”

  • 指定三个convolution-batchnorm-ReLU块。

  • 垫卷积的输入层,通过设置的输出具有相同的大小填充选项“相同”

  • 卷积第一层指定20过滤器的大小5。对于剩下的卷积层指定20过滤器的大小3。

  • 对于分类,指定一个完全连接层与大小匹配的类的数量

  • 输出映射到概率,包括softmax层。

当培训网络使用自定义循环,不包括一个输出层。

层= [imageInputLayer (inputSize正常化=“没有”)convolution2dLayer(5、20、填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer(3、20、填充=“相同”)batchNormalizationLayer reluLayer convolution2dLayer(3、20、填充=“相同”)batchNormalizationLayer reluLayer fullyConnectedLayer (numClasses) softmaxLayer];

创建一个dlnetwork数组对象的层。

净= dlnetwork(层)
网= dlnetwork属性:层:[12×1 nnet.cnn.layer.Layer]连接:[11×2表]可学的:[14×3表]状态:[6×3表]InputNames: {“imageinput”} OutputNames: {“softmax”}初始化:1

定义模型损失函数

训练一个深层神经网络是一种优化的任务。通过考虑一个神经网络作为一个函数 f ( X ; θ ) ,在那里 X 网络的输入, θ 可学的参数集,您可以优化吗 θ 减少一些损失值基于训练数据。例如,优化可学的参数 θ 这样,对于一个给定的输入 X 与相应的目标 T ,他们之间的误差最小化预测 Y = f ( X ; θ ) T

创建函数modelLoss中列出,损失函数模型的例子中,这需要作为输入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设备。万博1manbetx支持设备的信息,请参阅万博1manbetxGPU的万博1manbetx支持版本(并行计算工具箱)

兆贝可= minibatchqueue (augimdsTrain,MiniBatchSize = MiniBatchSize,MiniBatchFcn = @preprocessMiniBatch,MiniBatchFormat = [“SSCB””“]);

初始化培训进展阴谋。

图C = colororder;lineLossTrain = animatedline(颜色= C (2:));ylim([0正])包含(“迭代”)ylabel (“损失”网格)

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

速度= [];

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

  • 损失评估模型,使用渐变和状态dlfevalmodelLoss功能和更新网络状态。

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

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

  • 显示培训进展。

迭代= 0;开始=抽搐;%循环时期。时代= 1:numEpochs%洗牌数据。洗牌(兆贝可);%在mini-batches循环。hasdata(兆贝可)迭代=迭代+ 1;% mini-batch读取的数据。[X, T] =下一个(兆贝可);%评估模型梯度、州和使用dlfeval和损失% modelLoss功能和更新网络状态。(损失、渐变、状态)= dlfeval (@modelLoss,净,X, T);网。=状态;%确定为基于时间的学习速率衰减学习速率的时间表。learnRate = initialLearnRate /(1 +衰变*迭代);%更新使用个优化网络参数。(净、速度)= sgdmupdate(净、渐变速度,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(净、mbqTest、类);

评估分类精度。

tt = imdsValidation.Labels;精度=意味着(tt = =次)
精度= 0.7210

图表可视化预测在一个混乱。

次图confusionchart (tt)

大值对应的类的对角线显示准确的预测。大值对应的类之间的非对角的表示强烈的困惑。

万博1manbetx支持功能

损失函数模型

modelLoss函数接受一个dlnetwork对象mini-batch的输入数据X与相应的目标T并返回损失,损失的梯度参数对可学的,和网络状态。自动计算梯度,使用dlgradient函数。

函数(损失、渐变、状态)= modelLoss(净,X, T)%通过网络转发数据。[Y,状态]=前进(净,X);%计算熵的损失。损失= crossentropy (Y, T);%计算梯度的损失对可学的参数。梯度= dlgradient(损失、net.Learnables);结束

模型的预测函数

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

函数Y = modelPredictions(净、兆贝可类)Y = [];%在mini-batches循环。hasdata(兆贝可)X =(兆贝可);%进行预测。成绩=预测(净,X);%解码标签和附加到输出。标签= onehotdecode(成绩、类1)';Y = [Y;标签);结束结束

小批预处理功能

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

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

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

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

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

Mini-Batch预测预处理功能

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

函数X = preprocessMiniBatchPredictors (dataX)%连接。猫(X = 4, dataX{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

全部展开