DAGNetwork

Ориентированная сеть ациклического графика (DAG) для глубокого обучения

Описание

Сеть DAG является нейронной сетью для глубокого обучения со слоями, расположенными как ориентированный ациклический график. Сеть DAG может иметь более сложную архитектуру, в которой слои имеют входы от нескольких слоев и выходы к нескольким слоям.

Создание

Существует несколько способов создать DAGNetwork объект:

Примечание

Чтобы узнать о других предварительно обученных сетях, см. «Предварительно обученные глубокие нейронные сети».

Свойства

расширить все

Слои сети, заданные как Layer массив.

Соединения слоев, заданные как таблица с двумя столбцами.

Каждая строка таблицы представляет соединение в графике слоев. Первый столбец Source, определяет источник каждого соединения. Второй столбец, Destination, определяет адресат каждого соединения. Источники соединений и адресаты являются именами слоев или имеют форму 'layerName/IOName', где 'IOName' - имя входного или выходного параметра слоя.

Типы данных: table

Имена сетевого входного слоя, заданные как массив ячеек из векторов символов.

Типы данных: cell

Имена выходного слоя сети, заданные как массив ячеек из векторов символов.

Типы данных: cell

Функции объекта

activationsВычислите нейронную сеть для глубокого обучения слоя активации
classifyКлассификация данных с помощью обученной глубокой нейронной сети
predictПрогнозируйте ответы с помощью обученной глубокой нейронной сети
plotПостройте график слоя нейронной сети

Примеры

свернуть все

Создайте сеть простого ориентированного ациклического графика (DAG) для глубокого обучения. Обучите сеть классифицировать изображения цифр. Простая сеть в этом примере состоит из:

  • Основная ветвь со слоями, соединенными последовательно.

  • Ярлык соединение, содержащее один сверточный слой 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 соединяет все слои в layers последовательно. Постройте график графика слоев.

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

Создайте сверточный слой 1 на 1 и добавьте его к графику слоев. Задайте количество сверточных фильтров и шага так, чтобы размер активации совпадал с размером активации 'relu_3' слой. Эта схема позволяет слою сложения добавить выходы 'skipConv' и 'relu_3' слои. Чтобы проверить, что слой находится в графе, постройте график слоев.

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

Создайте ярлык соединения из 'relu_1' слой к 'add' слой. Поскольку вы задали два в качестве количества входов для слоя сложения при его создании, слой имеет два входов с именем 'in1' и 'in2'. The 'relu_3' слой уже подключен к 'in1' вход. Соедините 'relu_1' слой к 'skipConv' слой и 'skipConv' слой к 'in2' вход 'add' слой. Слой сложения теперь суммирует выходы 'relu_3' и 'skipConv' слои. Чтобы проверить правильность соединения слоев, постройте график слоев.

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

Загрузите данные обучения и валидации, которые состоят из 28 на 28 полутоновых изображений цифр.

[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);

Отображение свойств обученной сети. Сеть является 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

Расширенные возможности

..
Введенный в R2017b