exponenta event banner

Слой

Сетевой уровень для глубокого обучения

Описание

Слои, определяющие архитектуру нейронных сетей для глубокого обучения.

Создание

Список слоев глубокого обучения в MATLAB ® см. в разделе Список слоев глубокого обучения. Чтобы задать архитектуру нейронной сети со всеми слоями, соединенными последовательно, создайте массив слоев напрямую. Чтобы задать архитектуру сети, в которой уровни могут иметь несколько входов или выходов, используйте LayerGraph объект.

Можно также импортировать слои из Caffe, Keras и ONNX с помощью importCaffeLayers, importKerasLayers, и importONNXLayers соответственно.

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

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

trainNetworkОбучить нейронной сети глубокого обучения

Примеры

свернуть все

Определите архитектуру сверточной нейронной сети для классификации с одним сверточным уровнем, уровнем ReLU и полностью связанным уровнем.

layers = [ ...
    imageInputLayer([28 28 3])
    convolution2dLayer([5 5],10)
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer]
layers = 
  6x1 Layer array with layers:

     1   ''   Image Input             28x28x3 images with 'zerocenter' normalization
     2   ''   Convolution             10 5x5 convolutions with stride [1  1] and padding [0  0  0  0]
     3   ''   ReLU                    ReLU
     4   ''   Fully Connected         10 fully connected layer
     5   ''   Softmax                 softmax
     6   ''   Classification Output   crossentropyex

layers является Layer объект.

Можно также создать слои по отдельности, а затем объединить их.

input = imageInputLayer([28 28 3]);
conv = convolution2dLayer([5 5],10);
relu = reluLayer;
fc = fullyConnectedLayer(10);
sm = softmaxLayer;
co = classificationLayer;

layers = [ ...
    input
    conv
    relu
    fc
    sm
    co]
layers = 
  6x1 Layer array with layers:

     1   ''   Image Input             28x28x3 images with 'zerocenter' normalization
     2   ''   Convolution             10 5x5 convolutions with stride [1  1] and padding [0  0  0  0]
     3   ''   ReLU                    ReLU
     4   ''   Fully Connected         10 fully connected layer
     5   ''   Softmax                 softmax
     6   ''   Classification Output   crossentropyex

Определите архитектуру сверточной нейронной сети для классификации с одним сверточным уровнем, уровнем ReLU и полностью связанным уровнем.

layers = [ ...
    imageInputLayer([28 28 3])
    convolution2dLayer([5 5],10)
    reluLayer
    fullyConnectedLayer(10)
    softmaxLayer
    classificationLayer];

Отображение слоя ввода изображения путем выбора первого слоя.

layers(1)
ans = 
  ImageInputLayer with properties:

                      Name: ''
                 InputSize: [28 28 3]

   Hyperparameters
          DataAugmentation: 'none'
             Normalization: 'zerocenter'
    NormalizationDimension: 'auto'
                      Mean: []

Просмотр входного размера слоя ввода изображения.

layers(1).InputSize
ans = 1×3

    28    28     3

Отображение шага для сверточного слоя.

layers(2).Stride
ans = 1×2

     1     1

Доступ к коэффициенту скорости распознавания смещения для полностью подключенного уровня.

layers(4).BiasLearnRateFactor
ans = 1

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