exponenta event banner

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.

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

importONNXLayers

Если конвертер Deep Learning Toolbox Converter для формата модели ONNX не установлен, то функция предоставляет ссылку на необходимый пакет поддержки в обозревателе Add-On. Чтобы установить пакет поддержки, щелкните ссылку и нажмите кнопку Установить. Убедитесь, что установка выполнена успешно, импортировав сеть из файла модели '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).

Если сеть в 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Слой набора инструментов для глубокого обучения

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
Уровень ONNXToolbox™ обработки изображений
DepthToSpacedepthToSpace2dLayer(Панель инструментов обработки изображений)
Resizeresize2dLayer(Панель инструментов обработки изображений) или resize3dLayer(Панель инструментов обработки изображений)
SpaceToDepthspaceToDepthLayer(Панель инструментов обработки изображений)
Upsampleresize2dLayer(Панель инструментов обработки изображений) или resize3dLayer(Панель инструментов обработки изображений)

Совет

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

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

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

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

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

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

Ссылки

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

Представлен в R2018a