主要内容

dlnetwork

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

描述

一个dlnetwork对象支持使用自动区分自定义训练循环。

提示

对于大多数深度学习任务,您可以使用预先训练的网络,并使其适应您自己的数据。有关演示如何使用迁移学习重新训练卷积神经网络对一组新图像进行分类的示例,请参见训练深度学习网络对新图像进行分类.或者,您可以使用layerGraph的对象trainNetwork而且trainingOptions功能。

如果trainingOptions函数没有提供任务所需的训练选项,那么可以使用自动区分创建自定义训练循环。要了解更多,请参见为自定义训练循环定义深度学习网络

创建

描述

例子

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

一个初始化dlnetwork对象已准备好进行训练。的可学习参数和状态值根据网络输入层定义的输入大小,使用初始值对训练进行初始化。

例子

= dlnetwork (X1,…,Xn创建一个初始化dlnetwork对象使用网络数据布局对象或示例输入X1,…,Xn.的可学习参数和状态值是否根据定义的大小和格式用初始值初始化X1,…,Xn.使用此语法创建一个初始化的dlnetwork使用未连接到输入层的输入。

例子

= dlnetwork (“初始化”,特遣部队指定返回已初始化或未初始化的对象dlnetwork.使用此语法创建未初始化的网络。

未初始化的网络对可学习参数和状态参数具有未设置的空值,而且还没有准备好进行训练。必须初始化未初始化的对象dlnetwork才能使用它。如果希望将初始化推迟到以后进行,则创建未初始化的网络。你可以使用uninitializeddlnetwork对象,使用中间构建块创建复杂网络,然后将它们连接在一起,例如使用深度学习网络构成工作流。你可以初始化一个未初始化的对象dlnetwork使用初始化函数。

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

= dlnetwork (prunableNet的卷积层中删除为修剪所选择的过滤器prunableNet并返回压缩后的dlnetwork具有较少可学习参数且大小较小的对象。

要修剪一个深度神经网络,你需要深度学习工具箱™模型量化库支持包。此支持包是一个免费的附加组件,您可以使用附加组件资源管理器下载。另外,看到深度学习工具箱量化模型库

输入参数

全部展开

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

如果是一个数组,那么dlnetwork功能将层串联起来。

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

所支持的层的列表dlnetwork,请参阅支持层

示例网络输入或数据布局,指定为格式化dlarray对象或格式化networkDataLayout对象。软件的传播X1,…Xn通过网络来确定适当的可学习的大小和格式以及状态参数dlnetwork

是一个数组中提供示例输入的顺序与需要输入的层出现的顺序相同数组中。当是一个LayerGraph对象中,以与需要输入的层相同的顺序提供示例输入财产的LayerGraph

时不支持示例输入特遣部队是假的。

请注意

自动初始化只使用输入数据的大小和格式信息。对于依赖于输入数据上的值的初始化,必须手动初始化可学习参数。

返回初始化的标志dlnetwork,指定为数字或逻辑1(真正的)或0(假)。

如果特遣部队1的可学习参数和状态参数初始化根据网络输入层或提供的示例输入,提供用于训练的初始值。

如果特遣部队0,则软件不初始化可学习参数和状态参数。在使用未初始化的网络之前,必须首先使用初始化函数。时不支持示例输入特遣部队是假的。

使用一阶泰勒近似进行修剪的网络,指定为aTaylorPrunableNetwork对象。

属性

全部展开

此属性是只读的。

网络层,指定为数组中。

此属性是只读的。

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

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

数据类型:表格

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

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

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

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

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

数据类型:表格

网络状态,指定为表。

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

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

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

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

层状态包含在层操作期间计算的信息,这些信息将被保留,以便在层的后续转发中使用。例如,LSTM层的单元状态和隐藏状态,或批处理规范化层中的运行统计信息。

对于循环层,如LSTM层,使用HasStateInputs属性设置为1(true),则状态表不包含该层的状态项。

类的输出更新网络状态向前而且预测功能。

数据类型:表格

此属性是只读的。

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

数据类型:细胞

返回网络输出的层的名称,指定为字符向量的单元格数组或字符串数组。

要设置输出名称,必须初始化网络。

如果不指定输出名称,则软件将设置OutputNames属性设置为输出断开连接的层。如果一个层有多个输出,则断开的输出指定为“layerName / outputName”

预测而且向前函数在默认情况下返回由函数给出的层所输出的数据OutputNames财产。

数据类型:细胞|字符串

此属性是只读的。

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

如果初始化0(false)表示网络未初始化。在使用网络之前,必须初始化网络。方法初始化网络初始化函数。

如果初始化1(true),网络初始化,可用于训练和推理。如果您更改了可学习参数的值—例如,在训练期间—的值初始化仍然是1(真正的)。

数据类型:逻辑

对象的功能

预测 计算用于推理的深度学习网络输出
向前 计算用于训练的深度学习网络输出
初始化 初始化的可学习参数和状态参数dlnetwork
layerGraph 用于深度学习的网络层图
setL2Factor 设置层可学习参数的L2正则化因子
setLearnRateFactor 设置层可学习参数的学习率因子
getLearnRateFactor 得到层可学习参数的学习率因子
getL2Factor 得到层可学习参数的L2正则化因子
resetState 重置神经网络状态参数
情节 图神经网络结构
addInputLayer 添加网络输入层
addLayers 添加图层到图层图或网络
removeLayers 从图层图或网络中删除图层
connectLayers 在层图或网络中连接层
disconnectLayers 断开层图或网络中的层
replaceLayer 替换层中的层图或网络
总结 打印网络总结

例子

全部折叠

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

加载一个预先训练的GoogLeNet模型googlenet函数。此功能需要深度学习工具箱™模型GoogLeNet网络支持包。如果没有安装此支持包,则该功能提供下载链接。

网= googlenet;

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

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

将网络转换为adlnetwork对象。

dlnet = dlnetwork (lgraph)
dlnet = dlnetwork with properties: Layers: [142x1 nnet.cnn.layer.Layer] Connections: [168x2 table] Learnables: [116x3 table] State: [0x3 table] InputNames: {'data'} OutputNames: {'loss3-classifier'} Initialized: 1查看summary with summary。

使用网络数据布局对象创建多输入dlnetwork这样就可以训练了。该软件使用大小和格式信息来确定适当的大小和格式的可学习和状态参数dlnetwork

定义网络架构。构建一个有两个分支的网络。网络接受两个输入,每个分支有一个输入。使用附加层连接分支。

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

创建表示典型网络输入的大小和格式的网络数据布局对象。对于这两个输入,使用批处理大小为32。使用一个大小为64 × 64的输入,为第一个分支中的卷积层提供三个通道。对于第二个分支中的卷积层,使用一个64 × 64的18通道的输入。

X1 = dlarray(rand([64 64 3 32]),“SSCB”);X2 = dlarray(rand([32 32 18 32]),“SSCB”);

创建dlnetwork.控件中未连接层的顺序提供输入的属性lgraph

网= dlnetwork (lgraph (X1, X2);

检查网络是否已初始化并为训练做好了准备初始化网络属性。

网初始化
ans =逻辑1

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

你可以训练大多数类型的神经网络使用trainNetwork而且trainingOptions功能。如果trainingOptions函数没有提供所需的选项(例如,自定义学习速率计划),那么您可以使用dlarray而且dlnetwork对象自动区分。举个例子,展示如何使用trainNetwork功能,请参阅使用预训练网络的迁移学习

训练深度神经网络是一项优化任务。把神经网络看作一个函数 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 × 28 × 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 =元素个数(类);

定义网络

为图像分类定义网络。

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

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

  • 指定三个卷积-batchnorm- relu块。

  • 将输入填充到卷积层,以便输出具有相同的大小填充选项“相同”

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

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

  • 为了将输出映射到概率,需要包含一个softmax层。

当使用自定义训练循环训练网络时,不要包含输出层。

layers = [imageInputLayer(inputSize, normalized = .“没有”) convolution2dLayer(5、20、填充=“相同”) batchNormalizationLayer reluLayer convolution2dLayer(3,20,Padding= .“相同”) batchNormalizationLayer reluLayer convolution2dLayer(3,20,Padding= .“相同”) batchNormalizationLayer reluLayer fulllyconnectedlayer (numClasses) softmaxLayer];

创建一个dlnetwork对象。

净= dlnetwork(层)
层:[12×1 nnet.cnn.layer.Layer] Connections: [11×2 table] Learnables: [14×3 table] State: [6×3 table] InputNames: {'imageinput'} OutputNames: {'softmax'} Initialized: 1用summary查看摘要。

定义模型损失函数

训练深度神经网络是一项优化任务。把神经网络看作一个函数 f X θ ,在那里 X 是网络输入,和 θ 是否设置了可学习的参数,可以进行优化 θ 根据训练数据,最小化了一些损失值。例如,优化可学习参数 θ 这样对于一个给定的输入 X 有相应的目标 T ,它们将预测之间的误差最小化 Y f X θ 而且 T

创建函数modelLoss,列于损失函数模型部分,它将作为输入dlnetwork对象,它是具有相应目标的输入数据的小批处理,并返回损耗、损耗相对于可学习参数的梯度和网络状态。

指定培训选项

训练10个周期,小批次大小为128。

numEpochs = 10;miniBatchSize = 128;

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

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

火车模型

创建一个minibatchqueue对象,该对象在训练期间处理和管理小批量图像。为每个mini-batch:

  • 使用自定义的小批量预处理功能preprocessMiniBatch(在本例末尾定义)将标签转换为单热编码变量。

  • 用尺寸标签格式化图像数据“SSCB”(空间,空间,渠道,批处理)。默认情况下,minibatchqueue对象将数据转换为dlarray具有基础类型的对象.不要格式化类标签。

  • 如果有GPU,请使用GPU进行训练。默认情况下,minibatchqueue对象将每个输出转换为gpuArray如果有可用的GPU。使用GPU需要并行计算工具箱™和支持的GPU设备。有关支持的设备的信息,请参见GPU计算的需求(并行计算工具箱)

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

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

速度= [];

计算训练进度监视器的总迭代次数。

numObservationsTrain =元素个数(imdsTrain.Files);numIterationsPerEpoch = ceil(numObservationsTrain / miniBatchSize);numIterations = numEpochs * numIterationsPerEpoch;

初始化TrainingProgressMonitor对象。因为计时器在创建监视器对象时开始,所以要确保创建的对象接近训练循环。

监控= = trainingProgressMonitor(指标“损失”信息= (“时代”“LearnRate”),包含=“迭代”);

使用自定义训练循环训练网络。对于每个历元,洗牌数据并遍历小批数据。为每个mini-batch:

  • 评估模型损失,梯度和状态使用dlfeval而且modelLoss功能,并更新网络状态。

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

  • 更新网络参数sgdmupdate函数。

  • 更新训练进度监视器中的损耗、学习速率和epoch值。

  • 如果Stop属性为真,则停止。对象的Stop属性值TrainingProgressMonitor对象在单击Stop按钮时更改为true。

时代= 0;迭代= 0;循环遍历各个时代。epoch < numEpochs && ~monitor。停止epoch = epoch + 1;%洗牌数据。洗牌(兆贝可);在小批量上循环。hasdata(兆贝可)& & ~班长。停止迭代=迭代+ 1;读取小批数据。[X, T] =下一个(兆贝可);评估模型的梯度,状态和损失使用dlfeval和% modelLoss函数,并更新网络状态。(损失、渐变、状态)= dlfeval (@modelLoss,净,X, T);网=状态;为基于时间的衰减学习率时间表确定学习率。learnRate = initialLearnRate/(1 + decay*iteration);使用SGDM优化器更新网络参数。(净、速度)= sgdmupdate(净、渐变速度,learnRate动量);更新培训进度监视器。recordMetrics(监控、迭代损失=损失);updateInfo(监控、时代=时代LearnRate = LearnRate);班长。进度= 100 *迭代/numIterations;结束结束

测试模型

通过将验证集上的预测结果与真实标签进行比较,检验模型的分类精度。

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

  • 要忽略用于测试的标签,请将迷你批处理队列的输出数量设置为1。

  • 指定与培训时相同的小批大小。

  • 方法对预测器进行预处理preprocessMiniBatchPredictors函数,在示例末尾列出。

  • 对于数据存储的单个输出,指定小批处理格式“SSCB”(空间,空间,渠道,批处理)。

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

循环使用小批次并对图像进行分类modelPredictions函数,在示例末尾列出。

欧美= modelPredictions(净、mbqTest、类);

评估分类的准确性。

tt = imdsValidation.Labels;精度=平均值(TTest == YTest)
精度= 0.9750

在困惑图表中可视化预测。

次图confusionchart (tt)

对角线上的大值表示对对应类的准确预测。非对角线上的大值表示对应类之间存在很强的混淆。

支持功能

损失函数模型

modelLoss函数接受一个dlnetwork对象,一个小批量的输入数据X与相应的目标T并返回损失,损失相对于可学习参数的梯度、网络状态。方法可自动计算梯度dlgradient函数。

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

模型的预测函数

modelPredictions函数接受一个dlnetwork对象,一个minibatchqueue的输入数据兆贝可,并通过迭代所有数据来计算模型预测minibatchqueue对象。函数使用onehotdecode函数求出预测分数最高的班级。

函数Y = modelforecasts (net,mbq,classes) Y = [];在小批量上循环。hasdata(mbq) X = next(mbq);%进行预测。成绩=预测(净,X);解码标签并附加到输出。标签= onehotdecode(成绩、类1)';Y = [Y;标签);结束结束

小批量预处理功能

preprocessMiniBatch函数使用以下步骤预处理一小批预测器和标签:

  1. 方法对图像进行预处理preprocessMiniBatchPredictors函数。

  2. 从传入的单元格数组中提取标签数据,并沿着二次元连接到一个分类数组中。

  3. 一热编码类别标签到数字数组。对第一个维度进行编码会生成一个与网络输出形状匹配的编码数组。

函数[X, T] = preprocessMiniBatch (dataX人数()%预处理预测。X = preprocessMiniBatchPredictors (dataX);从单元格中提取标签数据并连接。猫(T = 2,人数({1:结束});单热编码标签。T = onehotencode (T, 1);结束

小批量预测器预处理函数

preprocessMiniBatchPredictors函数通过从输入单元格数组中提取图像数据并连接到数值数组来预处理小批预测器。对于灰度输入,在第四个维度上的连接将为每个图像添加第三个维度,以用作单通道维度。

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

加载预训练的网络。

网= squeezenet;

将网络转换为层图,删除输出层,并将其转换为dlnetwork对象。

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

可学的财产的dlnetwork对象是一个包含网络可学习参数的表。该表在单独的行中包含嵌套层的参数。查看可学习表的前几行。

可学的= dlnet.Learnables;头(可学的)
层参数值  __________________ _________ ___________________ " 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}

方法来冻结网络的可学习参数,循环遍历可学习参数并将学习速率设置为0setLearnRateFactor函数。

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

要在训练时使用更新的学习速率因子,必须在自定义训练循环中将dlnetwork对象传递给更新函数。例如,使用命令

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

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

定义网络层。该网络只有一个输入,没有连接到输入层。

layers = [convolution2dLayer(5,20) batchNormalizationLayer reluLayer fullyConnectedLayer(10) softmaxLayer];

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

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

检查网络是否未初始化。

dlnet。初始化
ans =逻辑0

该网络的可学习参数和状态参数没有初始化进行训练。要初始化网络,请使用初始化函数。

如果你想用dlnet方法直接在自定义训练循环中,然后可以使用初始化函数并提供示例输入。

如果你想用dlnet在自定义层中,您可以利用自动初始化的优势。如果使用自定义层内部的dlnetwork,然后dlnet是初始化时的父dlnetwork是否被构造(或者如果父网络被构造为未初始化的dlnetwork).方法训练的网络中使用自定义层trainNetwork函数,那么dlnet在训练时自动初始化。有关更多信息,请参见深度学习网络构成

更多关于

全部展开

扩展功能

版本历史

介绍了R2019b

全部展开

Baidu
map