importONNXLayers

Импорт слоев из сети ONNX

Описание

пример

layers = importONNXLayers(modelfile) импортирует слои ONNX™ сети (Open Neural Network Exchange) из файла modelfile. Можно обучить импортированные слои на новом наборе данных или собрать слои в сеть, готовую к предсказанию.

Эта функция требует пакета поддержки Deep Learning Toolbox™ Converter для формата модели ONNX. Если этот пакет поддержки не установлен, то функция предоставляет ссылку на загрузку.

пример

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

Для примера, importONNXLayers(modelfile,'ImportWeights',false) импортирует сетевую архитектуру без весов из файла modelfile.

Примеры

свернуть все

Загрузите и установите пакет поддержки Deep Learning Toolbox Converter для ONNX Model Format.

Напечатать importONNXLayers в командной строке.

importONNXLayers

Если Deep Learning Toolbox Converter для ONNX Model Format не установлен, то функция предоставляет ссылку на необходимый пакет поддержки в Add-On Explorer. Чтобы установить пакет поддержки, щелкните ссылку и нажмите кнопку Install. Проверьте, что установка успешна, импортировав сеть из файла модели 'cifarResNet.onnx' в командной строке. Если пакет поддержки установлен, то функция возвращает DAGNetwork объект.

modelfile = 'cifarResNet.onnx';
layers = importONNXLayers(modelfile,'OutputLayerType','classification')
layers = 

  LayerGraph with properties:

         Layers: [77×1 nnet.cnn.layer.Layer]
    Connections: [85×2 table]

Импортируйте архитектуру и веса остаточной нейронной сети, обученной на CIFAR-10 наборе данных. Укажите файл, содержащий сеть ONNX, и тип выходного слоя для добавления к импортированной сети.

modelfile = 'cifarResNet.onnx';
lgraph = importONNXLayers(modelfile, ...
    'OutputLayerType','classification', ...
    'ImportWeights',true)
lgraph = 
  LayerGraph with properties:

         Layers: [77×1 nnet.cnn.layer.Layer]
    Connections: [85×2 table]
     InputNames: {'Input_input'}
    OutputNames: {'ClassificationLayer_softmax'}

Анализ импортированной сетевой архитектуры.

analyzeNetwork(lgraph)

Импортируйте сеть ONNX, которая имеет несколько выходов при помощи importONNXLayers. Функция вставляет слои заполнителя для выходов. После импорта можно найти и заменить слои при помощи findPlaceholderLayers и replaceLayer, соответственно.

Укажите сетевой файл, из которого можно импортировать слои и веса.

modelfile = 'digitsMIMO.onnx';

Сеть в digitsMIMO.onnx имеет два выходных слоя: один классификационный слой для классификации цифр и один регрессионый слой для вычисления средней квадратичной невязки для предсказанных углов цифр. Импортируйте слои и веса из modelfile.

layers = importONNXLayers('digitsMIMO.onnx','ImportWeights',true)
Warning: ONNX network has multiple outputs. importONNXLayers inserts placeholder layers for the outputs. Find and replace the layers by using findPlaceholderLayers and replaceLayer, respectively.
layers = 
  LayerGraph with properties:

         Layers: [19×1 nnet.cnn.layer.Layer]
    Connections: [19×2 table]
     InputNames: {'Input_input'}
    OutputNames: {1×0 cell}

importONNXLayers отображает предупреждение и вставляет слои-заполнители для выхода слоев.

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

plot(layers)

График слоев имеет два выходных слоя: Output_fc_1_Flatten и Output_sm_1. Эти два слоя являются заполнителями для выходов. Можно проверить слои заполнителя путем просмотра Layers свойство или при помощи findPlaceholderLayers функция.

layers.Layers
ans = 
  19×1 Layer array with layers:

     1   'Input_input'           Image Input           28×28×1 images
     2   'conv_1'                Convolution           16 5×5×1 convolutions with stride [1  1] and padding [2  2  2  2]
     3   'BN_1'                  Batch Normalization   Batch normalization with 16 channels
     4   'relu_1'                ReLU                  ReLU
     5   'conv_2'                Convolution           32 1×1×16 convolutions with stride [2  2] and padding [0  0  0  0]
     6   'conv_3'                Convolution           32 3×3×16 convolutions with stride [2  2] and padding [1  1  1  1]
     7   'BN_2'                  Batch Normalization   Batch normalization with 32 channels
     8   'relu_2'                ReLU                  ReLU
     9   'conv_4'                Convolution           32 3×3×32 convolutions with stride [1  1] and padding [1  1  1  1]
    10   'BN_3'                  Batch Normalization   Batch normalization with 32 channels
    11   'relu_3'                ReLU                  ReLU
    12   'plus_1'                Addition              Element-wise addition of 2 inputs
    13   'fc_1'                  Convolution           1 14×14×32 convolutions with stride [1  1] and padding [0  0  0  0]
    14   'fc_2'                  Convolution           10 14×14×32 convolutions with stride [1  1] and padding [0  0  0  0]
    15   'sm_1_Flatten'          ONNX Flatten          Flatten activations into 1-D assuming C-style (row-major) order
    16   'sm_1'                  Softmax               softmax
    17   'Output_sm_1'           PLACEHOLDER LAYER     Placeholder for 'Output' ONNX operator
    18   'fc_1_Flatten'          ONNX Flatten          Flatten activations into 1-D assuming C-style (row-major) order
    19   'Output_fc_1_Flatten'   PLACEHOLDER LAYER     Placeholder for 'Output' ONNX operator
placeholderLayers = findPlaceholderLayers(layers)
placeholderLayers = 
  2×1 PlaceholderOutputLayer array with layers:

     1   'Output_sm_1'           PLACEHOLDER LAYER   Placeholder for 'Output' ONNX operator
     2   'Output_fc_1_Flatten'   PLACEHOLDER LAYER   Placeholder for 'Output' ONNX operator

Создайте выходные слои, чтобы заменить слои-заполнители. Сначала создайте слой классификации с именем Output_sm_1. Задайте классы выходного слоя следующим 0, 1..., 9. Если вы не задаете классы, то программное обеспечение автоматически устанавливает их на 1, 2..., N, где N количество классов.

output1 = classificationLayer('Name','Output_sm_1','Classes',string(0:9)); 

Создайте слой регрессии с именем Output_fc_1_Flatten.

output2 = regressionLayer('Name','Output_fc_1_Flatten'); 

Замените заполнитель слоев на output1 и output2 использование replaceLayer.

layers = replaceLayer(layers,'Output_sm_1',output1);
layers = replaceLayer(layers,'Output_fc_1_Flatten',output2);

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

layers.Layers
ans = 
  19×1 Layer array with layers:

     1   'Input_input'           Image Input             28×28×1 images
     2   'conv_1'                Convolution             16 5×5×1 convolutions with stride [1  1] and padding [2  2  2  2]
     3   'BN_1'                  Batch Normalization     Batch normalization with 16 channels
     4   'relu_1'                ReLU                    ReLU
     5   'conv_2'                Convolution             32 1×1×16 convolutions with stride [2  2] and padding [0  0  0  0]
     6   'conv_3'                Convolution             32 3×3×16 convolutions with stride [2  2] and padding [1  1  1  1]
     7   'BN_2'                  Batch Normalization     Batch normalization with 32 channels
     8   'relu_2'                ReLU                    ReLU
     9   'conv_4'                Convolution             32 3×3×32 convolutions with stride [1  1] and padding [1  1  1  1]
    10   'BN_3'                  Batch Normalization     Batch normalization with 32 channels
    11   'relu_3'                ReLU                    ReLU
    12   'plus_1'                Addition                Element-wise addition of 2 inputs
    13   'fc_1'                  Convolution             1 14×14×32 convolutions with stride [1  1] and padding [0  0  0  0]
    14   'fc_2'                  Convolution             10 14×14×32 convolutions with stride [1  1] and padding [0  0  0  0]
    15   'sm_1_Flatten'          ONNX Flatten            Flatten activations into 1-D assuming C-style (row-major) order
    16   'sm_1'                  Softmax                 softmax
    17   'Output_sm_1'           Classification Output   crossentropyex with '0' and 9 other classes
    18   'fc_1_Flatten'          ONNX Flatten            Flatten activations into 1-D assuming C-style (row-major) order
    19   'Output_fc_1_Flatten'   Regression Output       mean-squared-error

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

assembledNet = assembleNetwork(layers)
assembledNet = 
  DAGNetwork with properties:

         Layers: [19×1 nnet.cnn.layer.Layer]
    Connections: [19×2 table]
     InputNames: {'Input_input'}
    OutputNames: {'Output_sm_1'  'Output_fc_1_Flatten'}

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

свернуть все

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

Пример: 'cifarResNet.onnx'

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

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

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

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

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

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

Индикатор для импорта весов, а также сетевой архитектуры, заданный как false или true.

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

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

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

свернуть все

Сетевая архитектура, возвращенная как LayerGraph объект.

Ограничения

  • importONNXLayers поддерживает версии ONNX следующим образом:

    • Функция поддерживает промежуточное представление ONNX версии 6.

    • Функция полностью поддерживает наборы операторов ONNX 6, 7, 8 и 9.

    • Функция предлагает ограниченную поддержку аппаратов оператора ONNX 10 и 11.

Примечание

При импорте экспортированной сети слои повторно импортированной сети могут отличаться от исходной сети и не поддерживаться.

Подробнее о

свернуть все

Поддерживаемые слои ONNX

importONNXLayers поддерживает следующие слои ONNX с некоторыми ограничениями:

Слой ONNXСлой пакета Deep Learning Toolbox

Add

additionLayer или nnet.onnx.layer.ElementwiseAffineLayer

AveragePool

averagePooling2dLayer

BatchNormalization

batchNormalizationLayer

Concat

concatenationLayer

Constant

Нет (Импортировано как веса)

Conv*

convolution2dLayer

ConvTranspose

transposedConv2dLayer

Dropout

dropoutLayer

Elu

eluLayer

Gemm

fullyConnectedLayer если сеть ONNX является регулярной, в противном случае nnet.onnx.layer.FlattenLayer далее следуют convolution2dLayer

GlobalAveragePool

globalAveragePooling2dLayer

GlobalMaxPool

globalMaxPooling2dLayer

GRU

gruLayer

InstanceNormalization

groupNormalizationLayer с numGroups задается как "channel-wise"

LeakyRelu

leakyReluLayer

LRN

CrossChannelNormalizationLayer

LSTM

lstmLayer или bilstmLayer

MatMul

fullyConnectedLayer если сеть ONNX является регулярной, в противном случае convolution2dLayer

MaxPool

maxPooling2dLayer

Mul

multiplicationLayer

Relu

reluLayer или clippedReluLayer

Sigmoid

sigmoidLayer

Softmax

softmaxLayer

Sum

additionLayer

Tanh

tanhLayer

* Если pads атрибут Conv оператор является вектором с двумя элементами [p1,p2], importONNXLayers импортирует Conv как convolution2dLayer с аргументом имя-значение 'Padding' задается как [p1,p2,p1,p2].

Слой ONNXПользовательский слой импортера ONNX

Clip

nnet.onnx.layer.ClipLayer

Div

nnet.onnx.layer.ElementwiseAffineLayer

Flatten

nnet.onnx.layer.FlattenLayer или nnet.onnx.layer.Flatten3dLayer

Identity

nnet.onnx.layer.IdentityLayer

ImageScaler

nnet.onnx.layer.ElementwiseAffineLayer

PRelu

nnet.onnx.layer.PReluLayer

Reshape

nnet.onnx.layer.FlattenLayer

Sub

nnet.onnx.layer.ElementwiseAffineLayer
Слой ONNXImage Processing Toolbox™
DepthToSpacedepthToSpace2dLayer(Набор Image Processing Toolbox)
Resizeresize2dLayer (Image Processing Toolbox) или resize3dLayer(Набор Image Processing Toolbox)
SpaceToDepthspaceToDepthLayer(Набор Image Processing Toolbox)
Upsampleresize2dLayer (Image Processing Toolbox) или resize3dLayer(Набор Image Processing Toolbox)

Совет

  • Если сеть ONNX содержит слой, который не поддерживает Deep Learning Toolbox Converter для ONNX Model Format (см. «Поддерживаемые слои ONNX»), то importONNXLayers вставляет слой заполнителя вместо неподдерживаемого слоя. Чтобы найти имена и индексы неподдерживаемых слоев в сети, используйте findPlaceholderLayers функция. Затем можно заменить слой-заполнитель новым слоем, который вы задаете. Чтобы заменить слой, используйте replaceLayer. Для получения примера смотрите Импорт и Сборка сети ONNX с несколькими выходами.

  • Можно импортировать сеть ONNX с несколькими входами и несколькими выходами. Если сеть имеет несколько входов и один выход, используйте importONNXNetwork. Если сеть имеет несколько выходов, используйте importONNXLayers. importONNXLayers функция вставляет местозаполнитель слоев для выходов. После импорта можно найти и заменить слои-заполнители при помощи findPlaceholderLayers и replaceLayer, соответственно. Для получения примера смотрите Импорт и Сборка сети ONNX с несколькими выходами. Чтобы узнать о нейронной сети для глубокого обучения с несколькими входами и несколькими выходами, смотрите Multiple-Input и Multiple-Output Networks.

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

    • Чтобы изменить размер изображений, используйте imresize. Для примера, imresize(image,[227,227,3]).

    • Для преобразования изображений из RGB в формат BGR используйте flip. Для примера, flip(image,3).

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

Ссылки

[1] Откройте обмен нейронными сетями. https://github.com/onnx/.

Введенный в R2018a