Замените неподдерживаемый слой Keras на функциональный слой

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

Импортируйте сеть Keras

Импортируйте слои из сетевой модели Keras. Сеть в "digitsNet.h5" классифицирует изображения цифр.

filename = "digitsNet.h5";
layers = importKerasLayers(filename,ImportWeights=true)
Warning: Unable to import layer. Keras layer 'Activation' with the specified settings is not supported. The problem was: Activation type 'softsign' is not supported.
Warning: Unable to import layer. Keras layer 'Activation' with the specified settings is not supported. The problem was: Activation type 'softsign' is not supported.
Warning: Unable to import some Keras layers, because they are not supported by the Deep Learning Toolbox. They have been replaced by placeholder layers. To find these layers, call the function findPlaceholderLayers on the returned object.
layers = 
  13x1 Layer array with layers:

     1   'ImageInputLayer'               Image Input             28x28x1 images
     2   'conv2d'                        Convolution             8 3x3x1 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'conv2d_softsign'               PLACEHOLDER LAYER       Placeholder for 'Activation' Keras layer
     4   'max_pooling2d'                 Max Pooling             2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     5   'conv2d_1'                      Convolution             16 3x3x8 convolutions with stride [1  1] and padding [0  0  0  0]
     6   'conv2d_1_softsign'             PLACEHOLDER LAYER       Placeholder for 'Activation' Keras layer
     7   'max_pooling2d_1'               Max Pooling             2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     8   'flatten'                       Keras Flatten           Flatten activations into 1-D assuming C-style (row-major) order
     9   'dense'                         Fully Connected         100 fully connected layer
    10   'dense_relu'                    ReLU                    ReLU
    11   'dense_1'                       Fully Connected         10 fully connected layer
    12   'dense_1_softmax'               Softmax                 softmax
    13   'ClassificationLayer_dense_1'   Classification Output   crossentropyex

Сеть Keras содержит некоторые слои, которые не поддерживаются Deep Learning Toolbox. importKerasLayers функция выводит предупреждение и заменяет неподдерживаемые слои на слои заполнителя.

Замените слои заполнителя

Чтобы заменить слои заполнителя, сначала идентифицируйте имена слоев, чтобы заменить. Найдите слои заполнителя с помощью findPlaceholderLayers функция.

placeholderLayers = findPlaceholderLayers(layers)
placeholderLayers = 
  2x1 PlaceholderLayer array with layers:

     1   'conv2d_softsign'     PLACEHOLDER LAYER   Placeholder for 'Activation' Keras layer
     2   'conv2d_1_softsign'   PLACEHOLDER LAYER   Placeholder for 'Activation' Keras layer

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

Создайте функциональный слой с функцией, заданной softsign функция, присоединенная к этому примеру как вспомогательный файл. Чтобы получить доступ к этой функции, откройте этот пример как live скрипт. Установите описание слоя на "softsign".

layer = functionLayer(@softsign,Description="softsign");

Замените слои с помощью replaceLayer функция. Использовать replaceLayer функция, сначала преобразуйте массив слоя в график слоев.

lgraph = layerGraph(layers);
lgraph = replaceLayer(lgraph,"conv2d_softsign",layer);
lgraph = replaceLayer(lgraph,"conv2d_1_softsign",layer);

Задайте имена классов

Если импортированный слой классификации не содержит классы, то необходимо задать их перед предсказанием. Если вы не задаете классы, то программное обеспечение автоматически устанавливает классы на 1, 2N, где N количество классов.

Найдите индекс слоя классификации путем просмотра Layers свойство графика слоев.

lgraph.Layers
ans = 
  13x1 Layer array with layers:

     1   'ImageInputLayer'               Image Input             28x28x1 images
     2   'conv2d'                        Convolution             8 3x3x1 convolutions with stride [1  1] and padding [0  0  0  0]
     3   'layer'                         Function                softsign
     4   'max_pooling2d'                 Max Pooling             2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     5   'conv2d_1'                      Convolution             16 3x3x8 convolutions with stride [1  1] and padding [0  0  0  0]
     6   'layer_1'                       Function                softsign
     7   'max_pooling2d_1'               Max Pooling             2x2 max pooling with stride [2  2] and padding [0  0  0  0]
     8   'flatten'                       Keras Flatten           Flatten activations into 1-D assuming C-style (row-major) order
     9   'dense'                         Fully Connected         100 fully connected layer
    10   'dense_relu'                    ReLU                    ReLU
    11   'dense_1'                       Fully Connected         10 fully connected layer
    12   'dense_1_softmax'               Softmax                 softmax
    13   'ClassificationLayer_dense_1'   Classification Output   crossentropyex

Слой классификации имеет имя 'ClassificationLayer_dense_1'. Просмотрите слой классификации и проверяйте Classes свойство.

cLayer = lgraph.Layers(end)
cLayer = 
  ClassificationOutputLayer with properties:

            Name: 'ClassificationLayer_dense_1'
         Classes: 'auto'
    ClassWeights: 'none'
      OutputSize: 'auto'

   Hyperparameters
    LossFunction: 'crossentropyex'

Поскольку Classes свойством слоя является "auto", необходимо задать классы вручную. Установите классы на 0, 1, ..., 9, и затем замените импортированный слой классификации на новый.

cLayer.Classes = string(0:9);
lgraph = replaceLayer(lgraph,"ClassificationLayer_dense_1",cLayer);

Соберите сеть

Соберите график слоев с помощью assembleNetwork. Функция возвращает DAGNetwork объект, который готов использовать для предсказания.

net = assembleNetwork(lgraph)
net = 
  DAGNetwork with properties:

         Layers: [13x1 nnet.cnn.layer.Layer]
    Connections: [12x2 table]
     InputNames: {'ImageInputLayer'}
    OutputNames: {'ClassificationLayer_dense_1'}

Тестирование сети

Сделайте предсказания с сетью с помощью набора тестовых данных.

[XTest,YTest] = digitTest4DArrayData;
YPred = classify(net,XTest);

Просмотрите точность.

mean(YPred == YTest)
ans = 0.9900

Визуализируйте предсказания в матрице беспорядка.

confusionchart(YTest,YPred)

Figure contains an object of type ConfusionMatrixChart.

Смотрите также

| | | | | | |

Похожие темы