layerGraph

График слоев сети для глубокого обучения

Описание

График слоев задает архитектуру нейронной сети для глубокого обучения с более сложной структурой графа, в которой слои могут иметь входные параметры от нескольких слоев и выходов к нескольким слоям. Сети с этой структурой называются ориентированными сетями ациклического графика (DAG). После создания layerGraph можно использовать функции объекта для построения графика и изменения его путем добавления, удаления, соединения и разъединения слоев. Чтобы обучить сеть, используйте график слоев как layers входной параметр в trainNetwork.

Создание

Описание

пример

lgraph = layerGraph создает пустой график слоев, который не содержит слоев. Вы можете добавить слои к пустому графику с помощью addLayers функция.

пример

lgraph = layerGraph(layers) создает график слоев из массива слоев сети и устанавливает Layers свойство. Слои в lgraph соединяются в том же последовательном порядке, что и в layers. Все слои должны иметь уникальные, непустые имена.

пример

lgraph = layerGraph(dagNet) извлекает график слоев DAGNetwork. Для примера можно извлечь график слоев предварительно обученной сети, чтобы выполнить передачу обучения.

lgraph = layerGraph(dlnet) извлекает график слоев dlnetwork. Используйте этот синтаксис для использования dlnetwork с trainNetwork функция или Deep Network Designer.

Входные параметры

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

Сеть DAG, заданная как DAGNetwork объект.

Сеть для пользовательских циклов обучения, заданная как dlnetwork объект.

Для dlnetwork вход, программное обеспечение извлекает числовые данные из настраиваемых параметров и преобразует их в одинарную точность.

Свойства

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

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

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

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

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

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

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

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

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

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

addLayersДобавьте слои к графику слоев
removeLayersУдалите слои из графика слоев
replaceLayerЗамените слой на графике слоев
connectLayersСоедините слои в график слоев
disconnectLayersОтсоедините слои в графике слоев
plotПостройте график слоя нейронной сети

Примеры

свернуть все

Создайте пустой график слоев и массив слоев. Добавьте слои к графику слоев и постройте график. addLayers соединяет слои последовательно.

lgraph = layerGraph;

layers = [
    imageInputLayer([32 32 3],'Name','input')  
    convolution2dLayer(3,16,'Padding','same','Name','conv_1')
    batchNormalizationLayer('Name','BN_1')
    reluLayer('Name','relu_1')];

lgraph = addLayers(lgraph,layers);
figure
plot(lgraph)

Figure contains an axes. The axes contains an object of type graphplot.

Создайте массив слоев.

layers = [
    imageInputLayer([28 28 1],'Name','input')  
    convolution2dLayer(3,16,'Padding','same','Name','conv_1')
    batchNormalizationLayer('Name','BN_1')
    reluLayer('Name','relu_1')];

Создайте график слоев из массива слоев. layerGraph соединяет все слои в layers последовательно. Постройте график графика слоев.

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

Figure contains an axes. The axes contains an object of type graphplot.

Загрузите предварительно обученную сеть SqueezeNet. Вы можете использовать эту обученную сеть для классификации и предсказания.

net = squeezenet;

Чтобы изменить структуру сети, сначала извлеките структуру сети DAG с помощью layerGraph. Затем можно использовать функции объекта LayerGraph для изменения сетевой архитектуры.

lgraph = layerGraph(net)
lgraph = 
  LayerGraph with properties:

         Layers: [68x1 nnet.cnn.layer.Layer]
    Connections: [75x2 table]
     InputNames: {'data'}
    OutputNames: {'ClassificationLayer_predictions'}

Создайте сеть простого ориентированного ациклического графика (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

Совет

  • Графики слоев не могут задать архитектуру сетей долгой краткосрочной памяти (LSTM). Дополнительные сведения о том, как создать сеть LSTM, см. в разделе «Длинные краткосрочные сети памяти».

Введенный в R2017b