В этом примере показано, как импортировать слои из предварительно обученной сети 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)
importKerasNetwork
| assembleNetwork
| replaceLayer
| importKerasLayers
| trainNetwork
| layerGraph
| DAGNetwork
| findPlaceholderLayers