描述
有向无环图是深度学习中的一个神经网络。一个有向无环图有很复杂的结构,多层输入并且多层输出。
建立一个有向无环图
有多种方式建立一个有向无环图对象(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);
figure
plot(lgraph)
图1. 绘制层图
创建1×1卷积层,并将其添加到层图中。指定卷积过滤器和stride的数量,以便激活大小匹配“relu 3”层的激活大小。这种安排使添加层能够添加’skipConv’和’relu 3’层的输出。要检查层是否在图中,请绘制层图。
skipConv = convolution2dLayer(1,32,'Stride',2,'Name','skipConv');
lgraph = addLayers(lgraph,skipConv);
figure
plot(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');
figure
plot(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