Main Content

DAGNetwork

(不推荐)用于深度学习的有向无环图 (DAG) 网络

不推荐使用 DAGNetwork 对象。请改用 dlnetwork 对象。有关详细信息,请参阅版本历史记录

说明

DAG 网络是一种用于深度学习的神经网络,其层排列为有向无环图。DAG 网络可以具有更复杂的架构,其中的层可接收来自多个层的输入,也可以输出到多个层。

创建对象

创建 DAGNetwork 对象有多种方法:

注意

要了解其他预训练网络,请参阅预训练的深度神经网络

属性

全部展开

此 属性 为只读。

网络层,指定为 Layer 数组。

此 属性 为只读。

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

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

数据类型: table

此 属性 为只读。

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

数据类型: cell

此 属性 为只读。

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

数据类型: cell

对象函数

activations(不推荐)计算深度学习网络层激活值
classify(Not recommended) Classify data using trained deep learning neural network
predict(Not recommended) Predict responses using trained deep learning neural network
plot绘制神经网络架构
predictAndUpdateState(Not recommended) Predict responses using a trained recurrent neural network and update the network state
classifyAndUpdateState(Not recommended) Classify data using a trained recurrent neural network and update the network state
resetStateReset state parameters of neural network

示例

全部折叠

为深度学习创建一个简单的有向无环图 (DAG) 网络。

训练网络以对数字图像进行分类。此示例中的简单网络包括:

  • 一个具有顺序连接的层的主分支。

  • 一个包含单个 1×1 卷积层的快捷方式连接。快捷方式连接使参数梯度可以更轻松地从输出层流到较浅的网络层。

将网络的主分支创建为层数组。相加层按元素对多个输入求和。指定要求和的相加层的输入数目。为了便于以后添加连接,请为第一个 ReLU 层和相加层指定名称。

layers = [
    imageInputLayer([28 28 1])
    
    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')
    
    averagePooling2dLayer(2,'Stride',2)
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

根据层数组创建一个层图。layerGraph 按顺序连接 layers 中的所有层。绘制层图。

lgraph = layerGraph(layers);
figure
plot(lgraph)

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

创建一个 1×1 卷积层,并将其添加到层图中。指定卷积滤波器的数量和步幅,使激活大小与第三个 ReLU 层的激活大小匹配。这种排列使得相加层能够将第三个 ReLU 层和 1×1 卷积层的输出相加。要检查层是否在图中,请绘制层图。

skipConv = convolution2dLayer(1,32,'Stride',2,'Name','skipConv');
lgraph = addLayers(lgraph,skipConv);
figure
plot(lgraph)

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

创建从 'relu_1' 层到 'add' 层的快捷方式连接。由于您在创建相加层时将输入数目指定为 2,因此该层有两个输入,名为 'in1''in2'。第三个 ReLU 层已连接到 'in1' 输入。将 'relu_1' 层连接到 'skipConv' 层,并将 'skipConv' 层连接到 'add' 层的 'in2' 输入。相加层现在对第三个 ReLU 层和 'skipConv' 层的输出求和。要检查层是否正确连接,请绘制层图。

lgraph = connectLayers(lgraph,'relu_1','skipConv');
lgraph = connectLayers(lgraph,'skipConv','add/in2');
figure
plot(lgraph);

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

加载训练和验证数据,这些数据由 28×28 灰度数字图像组成。

[XTrain,YTrain] = digitTrain4DArrayData;
[XValidation,YValidation] = digitTest4DArrayData;

指定训练选项并训练网络。trainNetworkValidationFrequency 次迭代使用验证数据验证网络。

options = trainingOptions('sgdm', ...
    'MaxEpochs',8, ...
    'Shuffle','every-epoch', ...
    'ValidationData',{XValidation,YValidation}, ...
    'ValidationFrequency',30, ...
    'Verbose',false, ...
    'Plots','training-progress');
net = trainNetwork(XTrain,YTrain,lgraph,options);

Figure Training Progress (28-Oct-2023 04:07:53) contains 2 axes objects and another object of type uigridlayout. Axes object 1 with xlabel Iteration, ylabel Loss contains 15 objects of type patch, text, line. Axes object 2 with xlabel Iteration, ylabel Accuracy (%) contains 15 objects of type patch, text, line.

显示经过训练的网络的属性。该网络是一个 DAGNetwork 对象。

net
net = 
  DAGNetwork with properties:

         Layers: [16x1 nnet.cnn.layer.Layer]
    Connections: [16x2 table]
     InputNames: {'imageinput'}
    OutputNames: {'classoutput'}

对验证图像进行分类并计算准确度。网络的准确度很高。

YPredicted = classify(net,XValidation);
accuracy = mean(YPredicted == YValidation)
accuracy = 0.9932

扩展功能

版本历史记录

在 R2017b 中推出

全部折叠

R2024a: 不推荐

从 R2024a 开始,不推荐使用 DAGNetwork 对象,请改用 dlnetwork 对象。

目前没有停止支持 DAGNetwork 对象的计划。但是,推荐改用 dlnetwork 对象,此类对象具有以下优势:

  • dlnetwork 对象是一种统一的数据类型,支持网络构建、预测、内置训练、可视化、压缩、验证和自定义训练循环。

  • dlnetwork 对象支持更广泛的网络架构,您可以创建或从外部平台导入这些网络架构。

  • trainnet 函数支持 dlnetwork 对象,这使您能够轻松指定损失函数。您可以从内置损失函数中进行选择或指定自定义损失函数。

  • 使用 dlnetwork 对象进行训练和预测通常比使用 LayerGraphtrainNetwork 工作流更快。

要将已训练的 DAGNetwork 对象转换为 dlnetwork 对象,请使用 dag2dlnetwork 函数。

下表显示了 DAGNetwork 对象的一些典型用法,以及如何更新您的代码以改用 dlnetwork 对象函数。

不推荐推荐
Y = predict(net,X);
Y = minibatchpredict(net,X);
Y = classify(net,X);
scores = minibatchpredict(net,X);
Y = scores2label(scores,classNames);
plot(net);
plot(net);
Y = activations(net,X,layerName);
Y = predict(net,X,Outputs=layerName);
[net,Y] = predictAndUpdateState(net,X);
[Y,state] = predict(net,X);
net.State = state;
[net,Y] = classifyAndUpdateState(net,X);
[scores,state] = predict(net,X);
Y = scores2label(scores,classNames);
net.State = state;