主要内容

dlnetwork

深度学习神经网络

说明

dlnetwork 对象指定深度学习神经网络架构。

提示

对于大多数深度学习任务,您可以使用预训练神经网络,并使其适应您自己的数据。有关说明如何使用迁移学习来重新训练卷积神经网络以对一组新图像进行分类的示例,请参阅重新训练神经网络以对新图像进行分类。您也可以使用 trainnettrainingOptions 函数从头创建和训练神经网络。

如果 trainingOptions 函数没有提供您的任务所需的训练选项,则您可以使用自动微分创建自定义训练循环。要了解详细信息,请参阅使用自定义训练循环训练网络

如果 trainnet 函数没有提供您的任务所需的损失函数,您可以将 trainnet 的自定义损失函数指定为函数句柄。对于需要比预测值和目标值更多输入的损失函数(例如,需要访问神经网络或额外输入的损失函数),请使用自定义训练循环来训练模型。要了解详细信息,请参阅使用自定义训练循环训练网络

如果 Deep Learning Toolbox™ 没有提供您的任务所需的层,则您可以创建一个自定义层。要了解详细信息,请参阅定义自定义深度学习层。对于无法指定为由层组成的网络的模型,可以将模型定义为函数。要了解详细信息,请参阅Train Network Using Model Function

有关对哪项任务使用哪种训练方法的详细信息,请参阅Train Deep Learning Model in MATLAB

创建对象

描述

空网络

net = dlnetwork 创建一个没有任何层的 dlnetwork 对象。使用此语法从头开始创建神经网络。 (自 R2024a 起)

示例

具有输入层的网络

net = dlnetwork(layers) 使用指定的层创建神经网络,并初始化任何未设置的可学习参数和状态参数。该语法使用 layers 中的输入层来确定神经网络的可学习参数和状态参数的大小和格式。

layers 定义一个完整的单输入神经网络,其中的层按顺序排列并且具有输入层时,请使用此语法。

示例

net = dlnetwork(layers,OutputNames=names) 还设置 OutputNames 属性。OutputNames 属性指定对应于网络输出的层或层输出。

layers 定义一个完整的单输入多输出神经网络,其中的层按顺序排列并且具有输入层时,请使用此语法。

net = dlnetwork(layers,Initialize=tf) 指定是否初始化神经网络的可学习参数和状态参数。当 tf1 (true) 时,此语法等效于 net = dlnetwork(layers)。当 tf0 (false) 时,此语法等效于创建一个空网络,然后使用 addLayers 函数添加 layers

具有未连接输入的网络

net = dlnetwork(layers,X1,...,XN) 使用指定的层创建神经网络,并初始化任何未设置的可学习参数和状态参数。此语法使用网络数据布局对象或示例输入 X1,...,XN 来确定神经网络的可学习参数和状态值的大小和格式,其中 N 是网络输入的数量。

layers 定义一个完整的神经网络,其中的层按顺序排列并且具有未连接到输入层的输入时,请使用此语法。

net = dlnetwork(layers,X1,...,XN,OutputNames=names) 还设置 OutputNames 属性。

layers 定义一个完整的神经网络,该网络具有多个输出,其中的层按顺序排列并且具有未连接到输入层的输入时,请使用此语法。

转换

net = dlnetwork(prunableNet) 通过从 prunableNet 的卷积层中删除选择用于剪枝的滤波器,将 TaylorPrunableNetwork 转换为 dlnetwork 对象,并返回一个压缩的 dlnetwork 对象,该对象的可学习参数更少且大小更小。

net = dlnetwork(mdl) 将 Statistics and Machine Learning Toolbox™ 机器学习模型转换为 dlnetwork 对象。

输入参量

全部展开

网络层,指定为 Layer 数组。

软件按顺序连接各层。

要查看支持的层的列表,请参阅深度学习层列表

用于确定可学习参数和状态参数的大小和格式的示例网络输入或数据布局,每个输入或布局都指定为下列值之一:

软件通过网络传播 X1,...XN,以确定 dlnetwork 对象的可学习参数和状态参数的适当大小和格式,并初始化任何未设置的可学习参数或状态参数。

要创建接收未格式化数据的神经网络,请使用 inputLayer 对象并且不指定格式。 (自 R2025a 起)

在 R2025a 之前的版本中: X1,...XN 必须是格式化的 dlarraynetworkDataLayout 对象。

X1,...,XN 的顺序必须与 layers 中需要输入的层的顺序匹配。

注意

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

初始化可学习参数和状态参数的标志,指定为下列值之一:

  • 1 (true) - 初始化可学习参数和状态参数。软件使用 layers 中的输入层来确定可学习参数和状态参数的大小。

  • 0 (false) - 不初始化可学习参数和状态参数。在以下情况下使用此选项:

    • 需要对神经网络进行进一步编辑。例如,当您需要添加或删除层和连接时。

    • 在自定义层中使用网络,并且需要使用自定义初始化函数。

神经网络预测和自定义训练循环需要已初始化的网络。要初始化未初始化的网络,请使用 initialize 函数。

使用一阶泰勒逼近进行剪枝的网络,指定为 TaylorPrunableNetwork 对象。

对深度神经网络进行剪枝需要 Deep Learning Toolbox Model Compression Library 支持包。该支持包是一项免费附加功能,您可以使用附加功能资源管理器进行下载。或者,请参阅 Deep Learning Toolbox Model Compression Library

自 R2024b 起

分类或回归神经网络,指定为 ClassificationNeuralNetwork (Statistics and Machine Learning Toolbox)RegressionNeuralNetwork (Statistics and Machine Learning Toolbox)CompactClassificationNeuralNetwork (Statistics and Machine Learning Toolbox)CompactRegressionNeuralNetwork (Statistics and Machine Learning Toolbox) 对象。

fitcnet (Statistics and Machine Learning Toolbox)fitrnet (Statistics and Machine Learning Toolbox) 函数分别返回 ClassificationNeuralNetworkRegressionNeuralNetwork 对象。compact (Statistics and Machine Learning Toolbox) 函数返回 CompactClassificationNeuralNetworkCompactRegressionNeuralNetwork 对象。

对于具有非空 MuSigma 属性的模型,返回的神经网络具有执行等效规一化的输入层。

对于具有分类输入的模型,返回的神经网络需要 one-hot 编码分类数据。

提示

要在训练、预测或测试期间自动对神经网络的分类输入进行 one-hot 编码,请分别在 trainingOptionsminibatchpredicttestnet 函数中将 CategoricalInputEncoding 参量设置为 "one-hot" (自 R2025a 起)

在 R2024b 中: 使用 onehotencode 函数手动对分类输入进行 one-hot 编码。

警告

不支持 mdlResponseTransformScoreTransform 属性。使用网络进行预测时,请手动变换输出。

对于在 StandardizeResponses 参量设置为 1 (true) 时拟合的模型,返回的 dlnetwork 对象不会对响应进行去标准化处理。如果重新训练神经网络,则必须手动对目标进行标准化。使用神经网络进行预测时,必须手动对输出进行去标准化处理。

属性

全部展开

网络层,指定为 Layer 数组。

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

每个表行都表示神经网络中的一个连接。第一列 Source 指定每个连接的源。第二列 Destination 指定每个连接的目标。连接的源和目标或者是层名称,或者具有形式 "layerName/IOName",其中 "IOName" 是层输入或输出的名称。

数据类型: table

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

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

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

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

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

可学习参数值可以是复数值 (自 R2024a 起)

数据类型: table

网络状态,指定为表。

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

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

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

  • Value - 状态参数的值,指定为 dlarray 对象。

层状态保留在层运算期间计算的信息,以便在层的后续前向传导中使用。例如,LSTM 层包含单元状态和隐藏状态,批量归一化层计算运行统计信息。

对于 HasStateInputs 属性设置为 1 (true) 的循环层(例如 LSTM 层),状态表不包含该层的状态条目。

在训练或推理期间,您可以使用 forwardpredict 函数的输出来更新网络状态。

状态值可以是复数值 (自 R2024a 起)

数据类型: table

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

网络输入是输入层和层的未连接输入。

对于输入层和具有单个输入的层,输入名称就是层的名称。对于具有多个输入的层,输入名称为 "layerName/inputName",其中 layerName 是层的名称,inputName 是层输入的名称。

对于具有多个输入的网络,训练和预测函数使用此属性来确定输入的顺序。例如,对于 predict 函数的内存输入 X1,...,XM,输入的顺序必须与网络的 InputNames 属性中相应输入的顺序匹配。

要自定义顺序,请将 InputNames 设置为所需的顺序。 (自 R2024b 起)

在 R2024b 之前的版本中: 此属性是只读的。调整您的代码,使得对 predict 函数和类似函数的调用具有与 InputNames 指定的顺序匹配的输入参量。

注意

如果自定义 InputNames 属性,然后对神经网络进行编辑(例如,添加或删除层),则 InputNames 属性不会更改。此行为意味着,如果您添加或删除对应于网络输入的层,则还必须手动更新 InputNames 属性。

数据类型: cell

网络输出的名称,指定为字符向量元胞数组。

对于具有单个输出的层,输出名称是层的名称。对于具有多个输出的层,输出名称为 "layerName/outputName",其中 layerName 是层的名称,outputName 是层输出的名称。

如果您未指定输出名称,则在创建网络时,软件会将 OutputNames 属性设置为具有未连接输出的层。

对于具有多个输出的网络,训练和预测函数使用此属性来确定输出的顺序。例如,predict 函数的输出 Y1,...,YN 对应于网络的 OutputNames 属性指定的输出。

注意

如果自定义 OutputNames 属性,然后对神经网络进行编辑(例如,添加或删除层),则 OutputNames 属性不会更改。此行为意味着,如果您添加或删除对应于网络输出的层,则还必须手动更新 OutputNames 属性。

数据类型: cell

此 属性 为只读。

已初始化的网络的标志,指定为下列值之一:

  • 1 (true) - 网络已初始化并准备好用于预测和自定义训练循环。如果您更改可学习参数或状态参数的,则网络保持已初始化状态。

  • 0 (false) - 网络未初始化,未准备好用于预测或自定义训练循环。要初始化未初始化的网络,请使用 initialize 函数。

数据类型: logical

对象函数

addInputLayerAdd input layer to network
addLayers向神经网络添加层
removeLayers从神经网络中删除层
connectLayers在神经网络中连接各层
disconnectLayers在神经网络中断开层连接
replaceLayerReplace layer in neural network
getLayerLook up a layer by name or path
expandLayersExpand network layers
groupLayersGroup layers into network layers
summary打印网络摘要
plot绘制神经网络架构
initializeInitialize learnable and state parameters of neural network
predictCompute deep learning network output for inference
forwardCompute deep learning network output for training
resetStateReset state parameters of neural network
setL2FactorSet L2 regularization factor of layer learnable parameter
setLearnRateFactorSet learn rate factor of layer learnable parameter
getLearnRateFactorGet learn rate factor of layer learnable parameter
getL2FactorGet L2 regularization factor of layer learnable parameter

示例

全部折叠

定义一个双输出神经网络,该神经网络在给定二维图像作为输入的情况下预测分类标签和数值。

指定类和响应的数量。

numClasses = 10;
numResponses = 1;

创建一个空的神经网络。

net = dlnetwork;

定义网络主分支的各层和 softmax 输出。

layers = [
    imageInputLayer([28 28 1],Normalization="none")

    convolution2dLayer(5,16,Padding="same")
    batchNormalizationLayer
    reluLayer(Name="relu_1")

    convolution2dLayer(3,32,Padding="same",Stride=2)
    batchNormalizationLayer
    reluLayer
    convolution2dLayer(3,32,Padding="same")
    batchNormalizationLayer
    reluLayer

    additionLayer(2,Name="add")

    fullyConnectedLayer(numClasses)
    softmaxLayer(Name="softmax")];

net = addLayers(net,layers);

添加跳过连接。

layers = [
    convolution2dLayer(1,32,Stride=2,Name="conv_skip")
    batchNormalizationLayer
    reluLayer(Name="relu_skip")];

net = addLayers(net,layers);
net = connectLayers(net,"relu_1","conv_skip");
net = connectLayers(net,"relu_skip","add/in2");

为回归输出添加全连接层。

layers = fullyConnectedLayer(numResponses,Name="fc_2");
net = addLayers(net,layers);
net = connectLayers(net,"add","fc_2");

查看图中的神经网络。

figure
plot(net)

Figure contains an axes object. The axes object contains an object of type graphplot.

如果您有一个层数组,该层数组定义了完整的单输入神经网络,其中的层按顺序排列,并且有一个输入层,则可以直接将其转换为 dlnetwork 对象。

将 LSTM 网络指定为层数组。

layers = [
    sequenceInputLayer(12)
    lstmLayer(100)
    fullyConnectedLayer(9)
    softmaxLayer];

将层数组转换为 dlnetwork 对象。由于层数组有一个输入层而没有其他输入,因此软件会初始化神经网络。

net = dlnetwork(layers)
net = 
  dlnetwork with properties:

         Layers: [4×1 nnet.cnn.layer.Layer]
    Connections: [3×2 table]
     Learnables: [5×3 table]
          State: [2×3 table]
     InputNames: {'sequenceinput'}
    OutputNames: {'softmax'}
    Initialized: 1

  View summary with summary.

加载预训练网络。

net = imagePretrainedNetwork;

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

learnables = net.Learnables;
head(learnables)
          Layer           Parameter           Value       
    __________________    _________    ___________________

    "conv1"               "Weights"    {3×3×3×64  dlarray}
    "conv1"               "Bias"       {1×1×64    dlarray}
    "fire2-squeeze1x1"    "Weights"    {1×1×64×16 dlarray}
    "fire2-squeeze1x1"    "Bias"       {1×1×16    dlarray}
    "fire2-expand1x1"     "Weights"    {1×1×16×64 dlarray}
    "fire2-expand1x1"     "Bias"       {1×1×64    dlarray}
    "fire2-expand3x3"     "Weights"    {3×3×16×64 dlarray}
    "fire2-expand3x3"     "Bias"       {1×1×64    dlarray}

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

factor = 0;

numLearnables = size(learnables,1);
for i = 1:numLearnables
    layerName = learnables.Layer(i);
    parameterName = learnables.Parameter(i);
    
    net = setLearnRateFactor(net,layerName,parameterName,factor);
end

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

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

扩展功能

全部展开

版本历史记录

在 R2019b 中推出

全部展开