描述
有向无环图是深度学习中的一个神经网络。一个有向无环图有很复杂的结构,多层输入并且多层输出。
建立一个有向无环图
有多种方式建立一个有向无环图对象(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)导入模型。
- 使用
importKerasNetwork导入一个Keras模型。可以通过 Import and Plot Keras Network 查看对应的例子。 - 使用
importCaffeNetwork导入一个Caffe模型。通过 Import Caffe Network查看对应的例子。 - 使用
importONNXNetwork导入一个ONNX模型,通过Import ONNX Network查看对应的例子。目标函数
|activations| Compute deep learning network layer activations | | :—- | :—- | |classify| Classify data using a trained deep learning neural network | |predict| Predict responses using a trained deep learning neural network | |plot| Plot neural network layer graph |
例子
建立一个简单的有向无环网络用于深度学习,训练一个网络用于对数字的图片进行分类,一个简单的网络必须包含
- 各层序列要连接的主干
- 包含单个1比1卷积层的快捷方式连接。 快捷连接使参数梯度更容易从网络的输出层流到较早的层。
将网络的主分支创建为层阵列。 加法层逐元素求和多个输入。 指定要累加的附加层的输入数量。 所有图层都必须具有名称,并且所有名称都必须是唯一的。
layers = [imageInputLayer([28 28 1],'Name','input')convolution2dLayer(5,16,'Padding','same','Name','conv_1')batchNormalizationLayer('Name','BN_1')reluLayer('Name','relu_1')convolution2dLayer(3,32,'Padding','same','Stride',2,'Name','conv_2')batchNormalizationLayer('Name','BN_2')reluLayer('Name','relu_2')convolution2dLayer(3,32,'Padding','same','Name','conv_3')batchNormalizationLayer('Name','BN_3')reluLayer('Name','relu_3')additionLayer(2,'Name','add')averagePooling2dLayer(2,'Stride',2,'Name','avpool')fullyConnectedLayer(10,'Name','fc')softmaxLayer('Name','softmax')classificationLayer('Name','classOutput')];
从图层数组创建图层图。 layerGraph依次连接图层中的所有图层。 绘制层图。
lgraph = layerGraph(layers);figureplot(lgraph)

图1. 绘制层图
创建1×1卷积层,并将其添加到层图中。指定卷积过滤器和stride的数量,以便激活大小匹配“relu 3”层的激活大小。这种安排使添加层能够添加’skipConv’和’relu 3’层的输出。要检查层是否在图中,请绘制层图。
skipConv = convolution2dLayer(1,32,'Stride',2,'Name','skipConv');lgraph = addLayers(lgraph,skipConv);figureplot(lgraph)

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

图3. 层图
加载训练集和验证集数据,包含的是28x28大小的灰度图像
[XTrain, YTrain] = digitTrain4DArrayData;[XValidation, YValidation] = digitTest4DArrayData;
我们需要确认一下训练网络的参数,trainNetwork根据 ‘ValidationFrequency’这个参数的大小来迭代验证数据集从而更新网络。
options = trainingOptions('sgdm', ...'MaxEpochs',8, ...'Shuffle','every-epoch', ...'ValidationData',{XValidation,YValidation}, ...'ValidationFrequency',30, ...'Verbose',false, ...'Plots','training-progress');net = trainNetwork(XTrain,YTrain,lgraph,options);

图5. 训练数据
下面我们来看一下训练好的网络,这个网络是一个 DAGNetwork类型的网络。
net
net = DAGNetwork with properties:
Layers: [16×1 nnet.cnn.layer.Layer]Connections: [16×2 table]InputNames: {'input'}OutputNames: {'classOutput'}
看一下最后分类的准确率
YPredicted = classify(net, XValidation);accuracy = mean(YPredicted == YValidation);
accuracy = 0.9930
