描述

有向无环图是深度学习中的一个神经网络。一个有向无环图有很复杂的结构,多层输入并且多层输出。

建立一个有向无环图

有多种方式建立一个有向无环图对象(DAGNetwork object)。
我们可以加载注入 squeezenet,googlenet,resnet50,resnet101,inceptionv3。我们可以加载一个SqueezeNet Network,这里有关于 Pretrained Deep Neural Networks的更多信息。
使用trainNetwork来训练网络,可以通过 Train Deep Learning Network to Classify New Images看对应的例子。
同样也可以从 TensorFlow, Keras, Caffe或者ONNX(Open Neural Network Exchange)导入模型。

例子

建立一个简单的有向无环网络用于深度学习,训练一个网络用于对数字的图片进行分类,一个简单的网络必须包含

  • 各层序列要连接的主干
  • 包含单个1比1卷积层的快捷方式连接。 快捷连接使参数梯度更容易从网络的输出层流到较早的层。

将网络的主分支创建为层阵列。 加法层逐元素求和多个输入。 指定要累加的附加层的输入数量。 所有图层都必须具有名称,并且所有名称都必须是唯一的。

  1. layers = [
  2. imageInputLayer([28 28 1],'Name','input')
  3. convolution2dLayer(5,16,'Padding','same','Name','conv_1')
  4. batchNormalizationLayer('Name','BN_1')
  5. reluLayer('Name','relu_1')
  6. convolution2dLayer(3,32,'Padding','same','Stride',2,'Name','conv_2')
  7. batchNormalizationLayer('Name','BN_2')
  8. reluLayer('Name','relu_2')
  9. convolution2dLayer(3,32,'Padding','same','Name','conv_3')
  10. batchNormalizationLayer('Name','BN_3')
  11. reluLayer('Name','relu_3')
  12. additionLayer(2,'Name','add')
  13. averagePooling2dLayer(2,'Stride',2,'Name','avpool')
  14. fullyConnectedLayer(10,'Name','fc')
  15. softmaxLayer('Name','softmax')
  16. classificationLayer('Name','classOutput')];

从图层数组创建图层图。 layerGraph依次连接图层中的所有图层。 绘制层图。

  1. lgraph = layerGraph(layers);
  2. figure
  3. plot(lgraph)

♠ 有向无环图(DAGNetwork) - 图1
图1. 绘制层图
创建1×1卷积层,并将其添加到层图中。指定卷积过滤器和stride的数量,以便激活大小匹配“relu 3”层的激活大小。这种安排使添加层能够添加’skipConv’和’relu 3’层的输出。要检查层是否在图中,请绘制层图。

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

♠ 有向无环图(DAGNetwork) - 图2
图2.
创建从”relu 1”层到”add”层的快捷连接。因为您在创建添加层时指定了2作为输入的数量,因此该层有两个输入,分别名为”in1”和”in2”。”relu 3”层已经连接到”in1”输入。将”relu 1”层连接到”skipConv”层,将”skipConv”层连接到”add”层的”in2”输入。加法层现在对”relu 3”和”skipConv”层的输出进行求和。要检查各层是否正确连接,请绘制层图。

  1. lgraph = connectLayers(lgraph,'relu_1','skipConv');
  2. lgraph = connectLayers(lgraph,'skipConv','add/in2');
  3. figure
  4. plot(lgraph);

♠ 有向无环图(DAGNetwork) - 图3
图3. 层图
加载训练集和验证集数据,包含的是28x28大小的灰度图像

  1. [XTrain, YTrain] = digitTrain4DArrayData;
  2. [XValidation, YValidation] = digitTest4DArrayData;

我们需要确认一下训练网络的参数,trainNetwork根据 ‘ValidationFrequency’这个参数的大小来迭代验证数据集从而更新网络。

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

♠ 有向无环图(DAGNetwork) - 图4
图5. 训练数据
下面我们来看一下训练好的网络,这个网络是一个 DAGNetwork类型的网络。

  1. net

net = DAGNetwork with properties:

  1. Layers: [16×1 nnet.cnn.layer.Layer]
  2. Connections: [16×2 table]
  3. InputNames: {'input'}
  4. OutputNames: {'classOutput'}

看一下最后分类的准确率

  1. YPredicted = classify(net, XValidation);
  2. accuracy = mean(YPredicted == YValidation);

accuracy = 0.9930