主要内容

dlnetwork

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

描述

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

提示

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

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

创建

描述

例子

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

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

例子

= dlnetwork (X1,…,Xn创建一个初始化dlnetwork使用示例输入X1,…,Xn.的可学习参数和状态值使用基于示例输入定义的输入大小和格式的初始值进行初始化。使用此语法创建一个初始化的dlnetwork输入没有连接到输入层。

例子

= dlnetwork (“初始化”,特遣部队指定返回初始化的还是未初始化的dlnetwork.使用此语法创建一个未初始化的网络。

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

= dlnetwork (___、“OutputNames”名称)还设置OutputNames属性。的OutputNames属性指定返回网络输出的层。要设置输出名称,必须初始化网络。

= dlnetwork (prunableNet的卷积层中删除用于修剪的筛选器prunableNet并返回压缩后的dlnetwork具有较少可学习参数且尺寸较小的对象。

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

输入参数

全部展开

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

如果是一个数组,然后dlnetwork函数将层串联起来。

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

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

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

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

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

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

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

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

通过使用一阶泰勒近似来修剪网络,指定为aTaylorPrunableNetwork对象。

属性

全部展开

此属性是只读的。

网络层,指定为a数组中。

此属性是只读的。

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

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

数据类型:表格

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

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

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

  • 价值-参数的值,用a表示dlarray对象。

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

数据类型:表格

网络状态,指定为表。

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

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

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

  • 价值-状态参数的值,指定为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 复位神经网络状态参数

例子

全部折叠

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

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

Net = googlenet;

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

lgraph = layerGraph(net);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 .初始化

使用示例输入创建多输入dlnetwork准备好训练了。软件通过网络传播示例输入,以确定可学习参数和状态参数的适当大小和格式dlnetwork

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

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

创建与典型网络输入相同大小格式的示例网络输入。对于这两个输入,使用32的批处理大小。使用大小为64 * 64的输入,其中有三个通道用于该层的输入convBranch1.使用大小为64 * 64的输入,其中有18个通道用于该层的输入convBranch2

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

创建dlnetwork。类中未连接层出现的相同顺序提供输入lgraph的属性。

dlnet = dlnetwork(lgraph,dlX1,dlX2);

检查网络是否已经初始化并准备好进行训练。

dlnet。初始化
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”);imds = imageDatastore(数据文件夹,...IncludeSubfolders = true,...LabelSource =“foldernames”);

将数据划分为训练集和验证集。方法留出10%的数据用于验证splitEachLabel函数。

[imdsTrain,imdsValidation] = splitEachLabel(imds,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);

确定训练数据中的类数。

classes = categories(imdsTrain.Labels);numClasses = nummel(类);

定义网络

定义图像分类的网络。

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

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

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

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

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

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

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

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

layers = [imageInputLayer(inputSize,归一化=“没有”) convolution2dLayer(5、20、填充=“相同”) batchNormalizationLayer relullayer卷积2dlayer(3,20,填充=“相同”) batchNormalizationLayer relullayer卷积2dlayer(3,20,填充=“相同”) batchNormalizationLayer reluLayer fullyConnectedLayer(numClasses) softmaxLayer];

创建一个dlnetwork对象。

Net = dlnetwork(layers)
net = dlnetwork with properties: Layers: [12×1 nnet.cnn.layer.Layer] Connections: [11×2 table] Learnables: [14×3 table] State: [6×3 table] InputNames: {'imageinput'} OutputNames: {'softmax'} Initialized: 1 .初始化

定义模型损失函数

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

创建函数modelLoss,列于模型损失函数部分的示例,将其作为输入dlnetwork对象,带有相应目标的小批输入数据,并返回损失、损失相对于可学习参数的梯度以及网络状态。

指定培训项目

用128个小批量训练10个epoch。

numEpochs = 10;miniBatchSize = 128;

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

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

火车模型

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

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

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

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

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

初始化培训进度图。

图C = colororder;lineLossTrain = animatedline(Color=C(2,:));Ylim ([0 inf]) xlabel(“迭代”) ylabel (“损失”网格)

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

速度= [];

使用自定义训练循环训练网络。对于每个纪元,洗牌数据并在小批量数据上循环。对于每个小批量:

  • 方法评估模型损失、梯度和状态dlfeval而且modelLoss函数并更新网络状态。

  • 确定基于时间的衰减学习率计划的学习率。

  • 方法更新网络参数sgdmupdate函数。

  • 显示培训进度。

迭代= 0;开始= tic;%遍历epoch。epoch = 1:numEpochs% Shuffle数据。洗牌(兆贝可);在小批上循环。Hasdata (mbq)迭代=迭代+ 1;读取小批数据。[X,T] = next(mbq);使用dlfeval和% modelLoss函数并更新网络状态。[loss,gradients,state] = dlfeval(@modelLoss,net,X,T);网状态=状态;确定基于时间的衰减学习率计划的学习率。learnRate = initialLearnRate/(1 +衰减*迭代);使用SGDM优化器更新网络参数。[net,velocity] = sgdmupdate(net,gradients,velocity,learnRate,momentum);%显示培训进度。D = duration(0,0,toc(start),Format=“hh: mm: ss”);损失=双倍(损失);addpoints (lineLossTrain、迭代、失去)标题(”时代:“+ epoch +,消失:"+字符串(D))现在绘制结束结束

测试模型

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

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

  • 为了忽略标签进行测试,将迷你批处理队列的输出数量设置为1。

  • 指定用于训练的相同的小批大小。

  • 属性预处理预测器preprocessMiniBatchPredictors函数,在示例末尾列出。

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

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

循环小批和分类图像使用modelPredictions函数,在示例末尾列出。

YTest = modelforecasts (net,mbqTest,classes);

评估分类准确率。

TTest = imdsValidation.Labels;精度=平均值(TTest == YTest)
准确度= 0.7210

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

次图confusionchart (tt)

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

金宝app支持功能

模型损失函数

modelLoss函数的参数为dlnetwork对象,一小批输入数据X有相应的目标T并返回损失,关于可学习参数的损失梯度,表示网络状态。要自动计算梯度,请使用dlgradient函数。

函数[loss,gradients,state] = modelLoss(net,X,T)通过网络转发数据。[Y,状态]= forward(net,X);计算交叉熵损失。损失=交叉熵(Y,T);计算相对于可学习参数的损失梯度。gradients = dlgradient(loss,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. One-hot将分类标签编码为数字数组。编码到第一个维度会产生一个与网络输出形状匹配的编码数组。

函数[X,T] = preprocessMiniBatch(dataX,dataT)预处理预测器。X = preprocessMiniBatchPredictors(dataX);从单元格和级联中提取标签数据。T = cat(2,dataT{1:end});单热编码标签。T = onehotencode(T,1);结束

小批量预测预处理函数

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

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

加载一个预先训练好的网络。

网=挤压网;

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

lgraph = layerGraph(net);lgraph = removeLayers(“ClassificationLayer_predictions”);Dlnet = dlnetwork(lgraph);

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

learnables = dlnet.Learnables;头(可学的)
ans =8×3表层参数值__________________ _________ ___________________ "conv1" "Weights" {3x3x3x64 dlarray} "conv1" "Bias" {1x1x64 dlarray} "fire2-squeeze1x1" "Weights" {1x1x16 dlarray} "fire2-expand1x1" "Weights" {1x1x64 dlarray} "fire2-expand3x3" "Weights" {3x3x16x64 dlarray} "fire2-expand3x3" Bias" {1x1x64 dlarray} "fire2-expand3x3" "Bias" {1x1x64 dlarray}

要冻结网络的可学习参数,可以遍历可学习参数,并使用setLearnRateFactor函数。

因子= 0;numLearnables = size(learnables,1);i = 1:numLearnables layerName = learnables.Layer(i);parameterName = learnables.Parameter(i);dlnet = setLearnRateFactor(dlnet,layerName,parameterName,factor);结束

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

[dlnet,velocity] = sgdmupdate(dlnet,gradients,velocity);

创建一个未初始化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引入

全部展开