Main Content

DAGNetwork

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

说明

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

创建对象

创建 DAGNetwork 对象有多种方法:

注意

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

属性

全部展开

此 属性 为只读。

网络层,指定为 Layer 数组。

此 属性 为只读。

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

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

数据类型: table

此 属性 为只读。

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

数据类型: cell

此 属性 为只读。

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

数据类型: cell

对象函数

activations计算深度学习网络层激活
classifyClassify data using trained deep learning neural network
predictPredict responses using trained deep learning neural network
plot绘制神经网络架构

示例

全部折叠

为深度学习创建一个简单的有向无环图 (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 (16-Oct-2023 16:49:52) 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.9934

扩展功能

版本历史记录

在 R2017b 中推出