importKerasLayers

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

Описание

пример

layers = importKerasLayers(modelfile) импортирует слои сети TensorFlow™-Keras из файла модели. Функция возвращает слои, заданные в HDF5 (.h5) или JSON (.json) файл, данный именем файла modelfile.

Эта функция требует Средства импорта Deep Learning Toolbox™ для пакета поддержки Моделей TensorFlow-Keras. Если этот пакет поддержки не установлен, то функция обеспечивает ссылку на загрузку.

пример

layers = importKerasLayers(modelfile,Name,Value) импортирует слои из сети TensorFlow-Keras с дополнительными опциями, заданными одним или несколькими аргументами пары "имя-значение".

Например, importKerasLayers(modelfile,'ImportWeights',true) импортирует слоя сети и веса из файла модели modelfile.

Примеры

свернуть все

Загрузите и установите Средство импорта Deep Learning Toolbox для пакета поддержки Моделей TensorFlow-Keras.

Введите importKerasLayers в командной строке.

importKerasLayers

Если Средство импорта Deep Learning Toolbox для пакета поддержки Моделей TensorFlow-Keras не установлено, то функция обеспечивает ссылку на необходимый пакет поддержки в Add-On Explorer. Чтобы установить пакет поддержки, щелкните по ссылке, и затем нажмите Install. Проверяйте, что установка успешна путем импорта слоев из файла модели 'digitsDAGnet.h5' в командной строке. Если необходимый пакет поддержки установлен, то функция возвращает LayerGraph объект.

modelfile = 'digitsDAGnet.h5';
net = importKerasLayers(modelfile)
net = 
  LayerGraph with properties:

         Layers: [13x1 nnet.cnn.layer.Layer]
    Connections: [13x2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_activation_1'}

Импортируйте слоя сети из файла модели digitsDAGnet.h5.

modelfile = 'digitsDAGnet.h5';
layers = importKerasLayers(modelfile) 
layers = 
  LayerGraph with properties:

         Layers: [13x1 nnet.cnn.layer.Layer]
    Connections: [13x2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_activation_1'}

Постройте сетевую архитектуру.

plot(layers)

Задайте сетевой файл, чтобы импортировать.

modelfile = 'digitsDAGnet.h5';

Импортируйте слоя сети.

layers = importKerasLayers(modelfile)
layers = 
  LayerGraph with properties:

         Layers: [13x1 nnet.cnn.layer.Layer]
    Connections: [13x2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_activation_1'}

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

folder = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset');
imds = imageDatastore(folder, ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames');

Разделите набор данных в наборы обучающих данных и наборы тестов.

numTrainFiles = 750;
[imdsTrain,imdsTest] = splitEachLabel(imds,numTrainFiles,'randomize');

Установите опции обучения.

options = trainingOptions('sgdm', ...
    'MaxEpochs',10, ...
    'InitialLearnRate',0.001);

Обучите сеть с помощью обучающих данных.

net = trainNetwork(imdsTrain,layers,options);
Training on single CPU.
|========================================================================================|
|  Epoch  |  Iteration  |  Time Elapsed  |  Mini-batch  |  Mini-batch  |  Base Learning  |
|         |             |   (hh:mm:ss)   |   Accuracy   |     Loss     |      Rate       |
|========================================================================================|
|       1 |           1 |       00:00:00 |       15.62% |      12.6982 |          0.0010 |
|       1 |          50 |       00:00:05 |       63.28% |       1.2108 |          0.0010 |
|       2 |         100 |       00:00:10 |       85.16% |       0.4183 |          0.0010 |
|       3 |         150 |       00:00:15 |       96.09% |       0.1757 |          0.0010 |
|       4 |         200 |       00:00:20 |       99.22% |       0.0451 |          0.0010 |
|       5 |         250 |       00:00:26 |      100.00% |       0.0370 |          0.0010 |
|       6 |         300 |       00:00:32 |       96.88% |       0.1223 |          0.0010 |
|       7 |         350 |       00:00:37 |      100.00% |       0.0086 |          0.0010 |
|       7 |         400 |       00:00:42 |      100.00% |       0.0166 |          0.0010 |
|       8 |         450 |       00:00:47 |      100.00% |       0.0097 |          0.0010 |
|       9 |         500 |       00:00:52 |      100.00% |       0.0047 |          0.0010 |
|      10 |         550 |       00:00:58 |      100.00% |       0.0031 |          0.0010 |
|      10 |         580 |       00:01:01 |      100.00% |       0.0060 |          0.0010 |
|========================================================================================|

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

YPred = classify(net,imdsTest);
YTest = imdsTest.Labels;

Вычислите точность.

accuracy = sum(YPred == YTest)/numel(YTest)
accuracy = 0.9852

Задайте сетевой файл, чтобы импортировать слои и веса от.

modelfile = 'digitsDAGnet.h5';

Импортируйте сетевую архитектуру и веса из файлов, которые вы задали. Чтобы импортировать веса слоя, задайте 'ImportWeights' быть true. Функция также импортирует слои с их весами из того же файла HDF5.

layers = importKerasLayers(modelfile,'ImportWeights',true)
layers = 
  LayerGraph with properties:

         Layers: [13x1 nnet.cnn.layer.Layer]
    Connections: [13x2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_activation_1'}

Просмотрите размер весов во втором слое.

weights = layers.Layers(2).Weights;
size(weights)
ans = 1×4

     7     7     1    20

Функция импортировала веса, таким образом, веса слоя непусты.

Задайте сетевой файл, чтобы импортировать слои из и файл, содержащий веса.

modelfile = 'digitsDAGnet.json';
weights = 'digitsDAGnet.weights.h5';

Импортируйте сетевую архитектуру и веса из файлов, которые вы задали. .json файл не включает выходной слой. Задайте выходной слой, так, чтобы importKerasLayers добавил выходной слой в конце архитектуры сетей.

layers = importKerasLayers(modelfile, ...
    'ImportWeights',true, ...
    'WeightFile',weights, ...
    'OutputLayerType','classification')
layers = 
  LayerGraph with properties:

         Layers: [13x1 nnet.cnn.layer.Layer]
    Connections: [13x2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_activation_1'}

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

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

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

filename = 'digitsDAGnetwithnoise.h5';
lgraph = importKerasLayers(filename,'ImportWeights',true);
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.

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

Постройте график слоев с помощью plot.

figure
plot(lgraph)
title("Imported Network")

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

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

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

     1   'gaussian_noise_1'   PLACEHOLDER LAYER   Placeholder for 'GaussianNoise' Keras layer
     2   'gaussian_noise_2'   PLACEHOLDER LAYER   Placeholder for 'GaussianNoise' Keras layer

Отобразите настройки Keras этих слоев.

placeholderLayers.KerasConfiguration
ans = struct with fields:
    trainable: 1
         name: 'gaussian_noise_1'
       stddev: 1.5000

ans = struct with fields:
    trainable: 1
         name: 'gaussian_noise_2'
       stddev: 0.7000

Задайте пользовательский Гауссов шумовой слой. Чтобы создать этот слой, сохраните файл gaussianNoiseLayer.m в текущей папке. Затем создайте два Гауссовых шумовых слоя с теми же настройками как импортированные слои Keras.

gnLayer1 = gaussianNoiseLayer(1.5,'new_gaussian_noise_1');
gnLayer2 = gaussianNoiseLayer(0.7,'new_gaussian_noise_2');

Замените слои заполнителя на пользовательские слои с помощью replaceLayer.

lgraph = replaceLayer(lgraph,'gaussian_noise_1',gnLayer1);
lgraph = replaceLayer(lgraph,'gaussian_noise_2',gnLayer2);

Постройте обновленный график слоев с помощью plot.

figure
plot(lgraph)
title("Network with Replaced Layers")

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

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

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

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

     1   'input_1'                            Image Input             28x28x1 images
     2   'conv2d_1'                           Convolution             20 7x7x1 convolutions with stride [1  1] and padding 'same'
     3   'conv2d_1_relu'                      ReLU                    ReLU
     4   'conv2d_2'                           Convolution             20 3x3x1 convolutions with stride [1  1] and padding 'same'
     5   'conv2d_2_relu'                      ReLU                    ReLU
     6   'new_gaussian_noise_1'               Gaussian Noise          Gaussian noise with standard deviation 1.5
     7   'new_gaussian_noise_2'               Gaussian Noise          Gaussian noise with standard deviation 0.7
     8   'max_pooling2d_1'                    Max Pooling             2x2 max pooling with stride [2  2] and padding 'same'
     9   'max_pooling2d_2'                    Max Pooling             2x2 max pooling with stride [2  2] and padding 'same'
    10   'flatten_1'                          Keras Flatten           Flatten activations into 1-D assuming C-style (row-major) order
    11   'flatten_2'                          Keras Flatten           Flatten activations into 1-D assuming C-style (row-major) order
    12   'concatenate_1'                      Depth concatenation     Depth concatenation of 2 inputs
    13   'dense_1'                            Fully Connected         10 fully connected layer
    14   'activation_1'                       Softmax                 softmax
    15   'ClassificationLayer_activation_1'   Classification Output   crossentropyex

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

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

            Name: 'ClassificationLayer_activation_1'
         Classes: 'auto'
      OutputSize: 'auto'

   Hyperparameters
    LossFunction: 'crossentropyex'

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

cLayer.Classes = string(0:9)
cLayer = 
  ClassificationOutputLayer with properties:

            Name: 'ClassificationLayer_activation_1'
         Classes: [0    1    2    3    4    5    6    7    8    9]
      OutputSize: 10

   Hyperparameters
    LossFunction: 'crossentropyex'

lgraph = replaceLayer(lgraph,'ClassificationLayer_activation_1',cLayer);

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

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

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

         Layers: [15x1 nnet.cnn.layer.Layer]
    Connections: [15x2 table]
     InputNames: {'input_1'}
    OutputNames: {'ClassificationLayer_activation_1'}

Импортируйте слои из сети Keras, которая имеет параметрические исправленные линейные модульные слои (PReLU).

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

f(xi)={xiifxi>0aixiifxi0

где xi вход нелинейной активации f на канале i, и ai масштабный коэффициент, управляющий наклоном отрицательной части. Индекс i \in ai указывает, что параметр может быть вектором, и нелинейная активация может варьироваться на различных каналах.

importKerasNetwork и importKerasLayers может импортировать сеть, которая включает слои PReLU. Эти функции поддерживают и масштабные коэффициенты с векторным знаком и со скалярным знаком. Если масштабный коэффициент является вектором, то функции заменяют вектор на среднее значение векторных элементов. Можно изменить слой PReLU, чтобы иметь масштабный коэффициент с векторным знаком после импорта.

Задайте сетевой файл, чтобы импортировать.

modelfile = 'digitsDAGnetwithPReLU.h5';

digitsDAGnetwithPReLU включает два слоя PReLU. У каждого есть масштабный коэффициент со скалярным знаком, и другой имеет масштабный коэффициент с векторным знаком.

Импортируйте сетевую архитектуру и веса от modelfile.

layers = importKerasLayers(modelfile,'ImportWeights',true);
Warning: Layer 'p_re_lu_1' is a PReLU layer with a vector-valued parameter. The function replaces the parameter with the average of the vector elements. You can change the parameter back to a vector after import.

importKerasLayers функция выводит предупреждение для слоя PReLu p_re_lu_1. Функция заменяет масштабный коэффициент с векторным знаком p_re_lu_1 со средним значением векторных элементов. Можно возвратить параметр к вектору. Во-первых, найдите индекс слоя PReLU путем просмотра Layers свойство.

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

     1   'input_1'                       Image Input             28x28x1 images
     2   'conv2d_1'                      Convolution             20 7x7x1 convolutions with stride [1  1] and padding 'same'
     3   'conv2d_2'                      Convolution             20 3x3x1 convolutions with stride [1  1] and padding 'same'
     4   'p_re_lu_1'                     PReLU                   PReLU layer
     5   'p_re_lu_2'                     PReLU                   PReLU layer
     6   'max_pooling2d_1'               Max Pooling             2x2 max pooling with stride [2  2] and padding 'same'
     7   'max_pooling2d_2'               Max Pooling             2x2 max pooling with stride [2  2] and padding 'same'
     8   'flatten_1'                     Keras Flatten           Flatten activations into 1-D assuming C-style (row-major) order
     9   'flatten_2'                     Keras Flatten           Flatten activations into 1-D assuming C-style (row-major) order
    10   'concatenate_1'                 Depth concatenation     Depth concatenation of 2 inputs
    11   'dense_1'                       Fully Connected         10 fully connected layer
    12   'dense_1_softmax'               Softmax                 softmax
    13   'ClassificationLayer_dense_1'   Classification Output   crossentropyex

layers имеет два слоя PReLU. Извлеките четвертый слой p_re_lu_1, который первоначально имел масштабный коэффициент с векторным знаком для размерности канала.

tempLayer = layers.Layers(4)
tempLayer = 
  PreluLayer with properties:

        Name: 'p_re_lu_1'
    RawAlpha: [20x1 single]

   Learnable Parameters
       Alpha: 0.0044

  Show all properties

RawAlpha свойство содержит масштабный коэффициент с векторным знаком и Alpha свойство содержит скаляр, который является средним значением элемента векторных значений. Измените RawAlpha поместить векторные значения в третью размерность, которая соответствует размерности канала. Затем замена Alpha с измененным RawAlpha значения.

tempLayer.Alpha = reshape(tempLayer.RawAlpha,[1,1,numel(tempLayer.RawAlpha)])
tempLayer = 
  PreluLayer with properties:

        Name: 'p_re_lu_1'
    RawAlpha: [20x1 single]

   Learnable Parameters
       Alpha: [1x1x20 single]

  Show all properties

Замените p_re_lu_1 слой в layers с tempLayer.

layers = replaceLayer(layers,'p_re_lu_1', tempLayer);
layers.Layers(4)
ans = 
  PreluLayer with properties:

        Name: 'p_re_lu_1'
    RawAlpha: [20x1 single]

   Learnable Parameters
       Alpha: [1x1x20 single]

  Show all properties

Теперь p_re_lu_1 слой имеет масштабный коэффициент с векторным знаком.

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

свернуть все

Имя файла модели, содержащего сетевую архитектуру, и возможно веса в виде вектора символов или строкового скаляра. Файл должен быть в текущей папке в папке на пути MATLAB®, или необходимо включать полный или относительный путь в файл.

Если modelfile включает

  • Сетевая архитектура и веса, затем это должно быть в HDF5 (.h5формат.

  • Только сетевая архитектура, затем это может быть в HDF5 или JSON (.jsonформат.

Если modelfile включает только сетевую архитектуру, затем можно опционально предоставить веса с помощью 'ImportWeights' и 'WeightFile' аргументы в виде пар имя-значение. Если вы предоставляете веса, то файл весов должен быть в формате HDF5.

Пример: 'digitsnet.h5'

Типы данных: char | string

Аргументы в виде пар имя-значение

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: importKerasLayers(modelfile,'OutputLayerType','classification') импортирует слоя сети из файла модели modelfile и добавляет выходной слой для проблемы классификации в конце слоев Keras.

Тип выходного слоя, который функция добавляет в конец импортированной сетевой архитектуры когда modelfile не задает функцию потерь в виде 'classification', 'regression', или 'pixelclassification'. Добавление pixelClassificationLayer Объект (Computer Vision Toolbox) требует Computer Vision Toolbox™.

Если сеть в modelfile имеет несколько выходных параметров, затем вы не можете задать выходные типы слоя с помощью этого аргумента. importKerasLayers вставляет слои заполнителя для выходных параметров. После импорта можно найти и заменить слои заполнителя при помощи findPlaceholderLayers и replaceLayer, соответственно.

Пример: 'OutputLayerType','regression'

Размер входа отображает для сети в виде вектора из двух или трех численных значений, соответствующих [height,width] для полутоновых изображений и [height,width,channels] для цветных изображений, соответственно. Сеть использует эту информацию когда modelfile не задает входной размер.

Если сеть в modelfile имеет несколько входных параметров, затем вы не можете задать входные размеры с помощью этого аргумента. importKerasLayers вставляет слои заполнителя для входных параметров. После импорта можно найти и заменить слои заполнителя при помощи findPlaceholderLayers и replaceLayer, соответственно.

Пример: 'ImageInputSize',[28 28]

Индикатор, чтобы импортировать веса, а также сетевую архитектуру в виде любого false или true.

  • Если 'ImportWeights' true и modelfile включает веса, затем importKerasLayers импортирует веса из modelfile, который должен иметь HDF5 (.h5формат.

  • Если 'ImportWeights' true и modelfile не включает веса, затем необходимо задать отдельный файл, который включает веса, с помощью 'WeightFile' аргумент пары "имя-значение".

Пример: 'ImportWeights',true

Типы данных: логический

Имя файла веса, из которого можно импортировать веса когда modelfile не включает веса в виде вектора символов или строкового скаляра. Чтобы использовать этот аргумент пары "имя-значение", также необходимо установить 'ImportWeights' к true.

Файл веса должен быть в текущей папке в папке на пути MATLAB, или необходимо включать полный или относительный путь в файл.

Пример: 'WeightFile','weights.h5'

Типы данных: char | string

Выходные аргументы

свернуть все

Сетевая архитектура, возвращенная как Layer объект массивов, когда сеть Keras имеет тип Sequential, или возвратился как LayerGraph возразите, когда сеть Keras будет иметь тип Model.

Советы

  • importKerasLayers поддерживает следующие типы слоя Keras, с некоторыми ограничениями. Если сеть содержит какой-либо другой тип слоя, то программное обеспечение вставляет слой заполнителя вместо неподдерживаемого слоя. Чтобы найти имена и индексы неподдерживаемых слоев в сети, используйте findPlaceholderLayers функция. Затем можно заменить слой заполнителя на новый слой, который вы задаете. Чтобы заменить слой, использовать replaceLayer.

    Поддерживаемый слой KerasСоответствующий слой Deep Learning Toolbox
    AddadditionLayer

    Activation, с именами активации:

    • 'elu'

    • 'relu'

    • 'linear'

    • 'softmax'

    • 'sigmoid'

    • 'tanh'

    Слои:

    Усовершенствованные активации:

    • ELU

    • Softmax

    • ReLU

    • LeakyReLU

    • PReLu*

    Слои:

    AveragePooling2DaveragePooling2dLayer
    BatchNormalizationbatchNormalizationLayer
    Bidirectional(LSTM(__))bilstmLayer
    ConcatenatedepthConcatenationLayer
    Conv2Dconvolution2dLayer
    Conv2DTransposetransposedConv2dLayer
    CuDNNLSTMlstmLayer
    DensefullyConnectedLayer
    DepthwiseConv2DgroupedConvolution2dLayer
    DropoutdropoutLayer
    EmbeddingwordEmbeddingLayer (Text Analytics Toolbox)
    Flattennnet.keras.layer.FlattenCStyleLayer
    GlobalAveragePooling2DglobalAveragePooling2dLayer
    GlobalMaxPooling2DglobalMaxPooling2dLayer
    GRUgruLayer
    InputimageInputLayer
    LSTMlstmLayer
    MaxPooling2DmaxPooling2dLayer
    MultiplymultiplicationLayer
    SeparableConv2DgroupedConvolution2dLayer или convolution2dLayer
    UpSampling2Dresize2dLayer (Image Processing Toolbox)
    UpSampling3Dresize3dLayer (Image Processing Toolbox)
    ZeroPadding2Dnnet.keras.layer.ZeroPadding2DLayer

    *Для слоя PReLU, importKerasLayers заменяет масштабный коэффициент с векторным знаком на среднее значение векторных элементов. Можно возвратить параметр к вектору после импорта. Для примера смотрите Импорт Слой Keras PReLU.

  • Можно заменить слой заполнителя на новый слой, который вы задаете.

  • importKerasLayers поддерживает следующие функции потерь Keras:

    • mean_squared_error

    • categorical_crossentropy

    • sparse_categorical_crossentropy

    • binary_crossentropy

  • Можно импортировать сеть Keras с несколькими входными параметрами и несколькими выходными параметрами (MIMO). Использование importKerasNetwork если сеть включает входную информацию о размере для входных параметров и информацию о потере для выходных параметров. В противном случае использовать importKerasLayers. importKerasLayers функция вставляет слои заполнителя для вводов и выводов. После импорта можно найти и заменить слои заполнителя при помощи findPlaceholderLayers и replaceLayer, соответственно. Рабочий процесс для импорта сетей MIMO Keras совпадает с рабочим процессом для импорта сетей MIMO ONNX™. Для примера смотрите Импорт Сеть ONNX с Несколькими Выходными параметрами. Чтобы узнать о нейронной сети для глубокого обучения с несколькими входными параметрами и несколькими выходными параметрами, смотрите Несколько - Вход и Несколько - Выходные Сети.

  • Чтобы использовать предварительно обученную сеть для предсказания или передачи обучения на новых изображениях, необходимо предварительно обработать изображения таким же образом, как изображения, используемые, чтобы обучить импортированную модель, были предварительно обработаны. Изменение размеров изображений, вычитание среднего изображения и преобразование изображений от RGB до формата BGR являются наиболее распространенными операциями предварительной обработки.

    • Чтобы изменить размер изображений, использовать imresize. Например, imresize(im,[227 227]).

    • Чтобы преобразовать изображения от RGB до формата BGR, использовать flip. Например, flip(im,3).

    Для получения дополнительной информации о предварительной обработке изображений для обучения и предсказания, смотрите, Предварительно обрабатывают Изображения для Глубокого обучения.

Ссылки

[1] Keras: библиотека Python Deep Learning. https://keras.io.

Введенный в R2017b
Для просмотра документации необходимо авторизоваться на сайте