Main Content

importONNXNetwork

(To be removed) Import pretrained ONNX network

importONNXNetwork will be removed in a future release. Use importNetworkFromONNX instead. (since R2023b) For more information about updating your code, see Version History.

Description

net = importONNXNetwork(modelfile) imports a pretrained ONNX™ (Open Neural Network Exchange) network from the file modelfile. The function returns the network net as a DAGNetwork or dlnetwork object.

importONNXNetwork requires the Deep Learning Toolbox™ Converter for ONNX Model Format support package. If this support package is not installed, then importONNXNetwork provides a download link.

Note

By default, importONNXNetwork tries to generate a custom layer when the software cannot convert an ONNX operator into an equivalent built-in MATLAB® layer. For a list of operators for which the software supports conversion, see ONNX Operators Supported for Conversion into Built-In MATLAB Layers.

importONNXNetwork saves the generated custom layers in the namespace +modelfile.

importONNXNetwork does not automatically generate a custom layer for each ONNX operator that is not supported for conversion into a built-in MATLAB layer. For more information on how to handle unsupported layers, see Alternative Functionality.

example

net = importONNXNetwork(modelfile,Name=Value) imports a pretrained ONNX network with additional options specified by one or more name-value arguments. For example, OutputLayerType="classification" imports the network as a DAGNetwork object with a classification output layer appended to the end of the first output branch of the imported network architecture.

example

Examples

collapse all

Download and install the Deep Learning Toolbox Converter for ONNX Model Format support package.

Type importONNXNetwork at the command line.

importONNXNetwork

If Deep Learning Toolbox Converter for ONNX Model Format is not installed, then the function provides a link to the required support package in the Add-On Explorer. To install the support package, click the link, and then click Install. Check that the installation is successful by importing the network from the model file "simplenet.onnx" at the command line. If the support package is installed, then the function returns a DAGNetwork object.

modelfile = "simplenet.onnx";
net = importONNXNetwork(modelfile)
net = 
  DAGNetwork with properties:

         Layers: [9×1 nnet.cnn.layer.Layer]
    Connections: [8×2 table]
     InputNames: {'imageinput'}
    OutputNames: {'ClassificationLayer_softmax1002'}

Plot the network architecture.

plot(net)

Import a pretrained ONNX network as a DAGNetwork object, and use the imported network to classify an image.

Generate an ONNX model of the squeezenet convolution neural network.

squeezeNet = squeezenet;
exportONNXNetwork(squeezeNet,"squeezeNet.onnx");

Specify the class names.

ClassNames = squeezeNet.Layers(end).Classes;

Import the pretrained squeezeNet.onnx model, and specify the classes. By default, importONNXNetwork imports the network as a DAGNetwork object.

net = importONNXNetwork("squeezeNet.onnx",Classes=ClassNames)
net = 
  DAGNetwork with properties:

         Layers: [70×1 nnet.cnn.layer.Layer]
    Connections: [77×2 table]
     InputNames: {'data'}
    OutputNames: {'ClassificationLayer_prob'}

Analyze the imported network.

analyzeNetwork(net)

squeezeNet_DAGNetwork.png

Read the image you want to classify and display the size of the image. The image is 384-by-512 pixels and has three color channels (RGB).

I = imread("peppers.png");
size(I)
ans = 1×3

   384   512     3

Resize the image to the input size of the network. Show the image.

I = imresize(I,[227 227]);
imshow(I)

Classify the image using the imported network.

label = classify(net,I)
label = categorical
     bell pepper 

Import a pretrained ONNX network as a dlnetwork object, and use the imported network to classify an image.

Generate an ONNX model of the squeezenet convolution neural network.

squeezeNet = squeezenet;
exportONNXNetwork(squeezeNet,"squeezeNet.onnx");

Specify the class names.

ClassNames = squeezeNet.Layers(end).Classes;

Import the pretrained squeezeNet.onnx model as a dlnetwork object.

net = importONNXNetwork("squeezeNet.onnx",TargetNetwork="dlnetwork")
net = 
  dlnetwork with properties:

         Layers: [70×1 nnet.cnn.layer.Layer]
    Connections: [77×2 table]
     Learnables: [52×3 table]
          State: [0×3 table]
     InputNames: {'data'}
    OutputNames: {'probOutput'}
    Initialized: 1

Read the image you want to classify and display the size of the image. The image is 384-by-512 pixels and has three color channels (RGB).

I = imread("peppers.png");
size(I)
ans = 1×3

   384   512     3

Resize the image to the input size of the network. Show the image.

I = imresize(I,[227 227]);
imshow(I)

Convert the image to a dlarray. Format the images with the dimensions "SSCB" (spatial, spatial, channel, batch). In this case, the batch size is 1 and you can omit it ("SSC").

I_dlarray = dlarray(single(I),"SSCB");

Classify the sample image and find the predicted label.

prob = predict(net,I_dlarray);
[~,label] = max(prob);

Display the classification result.

ClassNames(label)
ans = categorical
     bell pepper 

Import an ONNX network that has multiple outputs as a DAGNetwork object.

Specify the ONNX model file and import the pretrained ONNX model. By default, importONNXNetwork imports the network as a DAGNetwork object.

modelfile = "digitsMIMO.onnx";
net = importONNXNetwork(modelfile)
net = 
  DAGNetwork with properties:

         Layers: [19×1 nnet.cnn.layer.Layer]
    Connections: [19×2 table]
     InputNames: {'input'}
    OutputNames: {'ClassificationLayer_sm_1'  'RegressionLayer_fc_1_Flatten'}

The network has two output layers: one classification layer (ClassificationLayer_sm_1) to classify digits and one regression layer (RegressionLayer_fc_1_Flatten) to compute the mean squared error for the predicted angles of the digits. Plot the network architecture.

plot(net)
title('digitsMIMO Network Architecture')

To make predictions using the imported network, use the predict function and set the ReturnCategorical option to true.

Input Arguments

collapse all

Name of the ONNX model file containing the network, specified as a character vector or string scalar. The file must be in the current folder or in a folder on the MATLAB path, or you must include a full or relative path to the file.

Example: "cifarResNet.onnx"

Name-Value Arguments

collapse all

Specify optional pairs of arguments as Name1=Value1,...,NameN=ValueN, where Name is the argument name and Value is the corresponding value. Name-value arguments must appear after other arguments, but the order of the pairs does not matter.

Example: importONNXNetwork(modelfile,TargetNetwork="dagnetwork",GenerateCustomLayers=true,Namespace="CustomLayers") imports the network in modelfile as a DAGNetwork object and saves the automatically generated custom layers in the namespace +CustomLayers in the current folder.

Option for custom layer generation, specified as a numeric or logical 1 (true) or 0 (false). If you set GenerateCustomLayers to true, importONNXNetwork tries to generate a custom layer when the software cannot convert an ONNX operator into an equivalent built-in MATLAB layer. importONNXNetwork saves each generated custom layer to a separate .m file in +Namespace. To view or edit a custom layer, open the associated .m file. For more information on custom layers, see Custom Layers.

Example: GenerateCustomLayers=false

Name of the custom layers namespace in which importONNXNetwork saves custom layers, specified as a character vector or string scalar. importONNXNetwork saves the custom layers namespace +Namespace in the current folder. If you do not specify Namespace, then importONNXNetwork saves the custom layers in a namespace named +modelfile in the current folder. For more information about namespaces, see Create Namespaces.

Example: Namespace="shufflenet_9"

Example: Namespace="CustomLayers"

Target type of Deep Learning Toolbox network, specified as "dagnetwork" or "dlnetwork". The function importONNXNetwork imports the network net as a DAGNetwork or dlnetwork object.

  • If you import the network as a DAGNetwork object, net must include input and output layers specified by the ONNX model or that you specify using the name-value arguments InputDataFormats, OutputDataFormats, or OutputLayerType.

  • If you import the network as a dlnetwork object, importONNXNetwork appends a CustomOutputLayer at the end of each output branch of net, and might append a CustomInputLayer at the beginning of an input branch. The function appends a CustomInputLayer if the input data formats or input image sizes are not known. For network-specific information on the data formats of these layers, see the properties of the CustomInputLayer and CustomOutputLayer objects. For information on how to interpret Deep Learning Toolbox input and output data formats, see Conversion of ONNX Input and Output Tensors into Built-In MATLAB Layers.

Example: TargetNetwork="dlnetwork"

Data format of the network inputs, specified as a character vector, string scalar, or string array. importONNXNetwork tries to interpret the input data formats from the ONNX file. The name-value argument InputDataFormats is useful when importONNXNetwork cannot derive the input data formats.

Set InputDataFomats to a data format in the ordering of an ONNX input tensor. For example, if you specify InputDataFormats as "BSSC", the imported network has one imageInputLayer input. For more information on how importONNXNetwork interprets the data format of ONNX input tensors and how to specify InputDataFormats for different Deep Learning Toolbox input layers, see Conversion of ONNX Input and Output Tensors into Built-In MATLAB Layers.

If you specify an empty data format ([] or ""), importONNXNetwork automatically interprets the input data format.

Example: InputDataFormats='BSSC'

Example: InputDataFormats="BSSC"

Example: InputDataFormats=["BCSS","","BC"]

Example: InputDataFormats={'BCSS',[],'BC'}

Data Types: char | string | cell

Data format of the network outputs, specified as a character vector, string scalar, or string array. importONNXNetwork tries to interpret the output data formats from the ONNX file. The name-value argument OutputDataFormats is useful when importONNXNetwork cannot derive the output data formats.

Set OutputDataFormats to a data format in the ordering of an ONNX output tensor. For example, if you specify OutputDataFormats as "BC", the imported network has one classificationLayer output. For more information on how importONNXNetwork interprets the data format of ONNX output tensors and how to specify OutputDataFormats for different Deep Learning Toolbox output layers, see Conversion of ONNX Input and Output Tensors into Built-In MATLAB Layers.

If you specify an empty data format ([] or ""), importONNXNetwork automatically interprets the output data format.

Example: OutputDataFormats='BC'

Example: OutputDataFormats="BC"

Example: OutputDataFormats=["BCSS","","BC"]

Example: OutputDataFormats={'BCSS',[],'BC'}

Data Types: char | string | cell

Size of the input image for the first network input, specified as a vector of three or four numerical values corresponding to [height,width,channels] for 2-D images and [height,width,depth,channels] for 3-D images. The network uses this information only when the ONNX model in modelfile does not specify the input size.

Example: ImageInputSize=[28 28 1] for a 2-D grayscale input image

Example: ImageInputSize=[224 224 3] for a 2-D color input image

Example: ImageInputSize=[28 28 36 3] for a 3-D color input image

Layer type for the first network output, specified as "classification", "regression", or "pixelclassification". The function importONNXNetwork appends a ClassificationOutputLayer, RegressionOutputLayer, or pixelClassificationLayer (Computer Vision Toolbox) object to the end of the first output branch of the imported network architecture. Appending a pixelClassificationLayer (Computer Vision Toolbox) object requires Computer Vision Toolbox™. If the ONNX model in modelfile specifies the output layer type or you specify TargetNetwork as "dlnetwork", importONNXNetwork ignores the name-value argument OutputLayerType.

Example: OutputLayerType="regression"

Classes of the output layer for the first network output, specified as a categorical vector, string array, cell array of character vectors, or "auto". If Classes is "auto", then importONNXNetwork sets the classes to categorical(1:N), where N is the number of classes. If you specify a string array or cell array of character vectors str, then importONNXNetwork sets the classes of the output layer to categorical(str,str). If you specify TargetNetwork as "dlnetwork", importONNXNetwork ignores the name-value argument Classes.

Example: Classes={'0','1','3'}

Example: Classes=categorical({'dog','cat'})

Data Types: char | categorical | string | cell

Constant folding optimization, specified as "deep", "shallow", or "none". Constant folding optimizes the imported network architecture by computing operations on ONNX initializers (initial constant values) during the conversion of ONNX operators to equivalent built-in MATLAB layers.

If the ONNX network contains operators that the software cannot convert to equivalent built-in MATLAB layers (see ONNX Operators Supported for Conversion into Built-In MATLAB Layers), constant folding optimization can reduce the number of unsupported layers. When you set FoldConstants to "deep", the network has the same or fewer unsupported layers, compared to when you set the argument to "shallow". However, the network importing time might increase. Set FoldConstants to "none" to disable the network architecture optimization.

If the network still contains unsupported layers after constant folding optimization, importONNXNetwork returns an error. In this case, you can import the network by using importONNXLayers or importONNXFunction. For more information, see Alternative Functionality.

Example: FoldConstants="shallow"

Output Arguments

collapse all

Pretrained ONNX network, returned as a DAGNetwork or dlnetwork object.

  • Specify TargetNetwork as "dagnetwork" to import the network as a DAGNetwork object. On the DAGNetwork object, you then predict class labels by using the classify function.

  • Specify TargetNetwork as "dlnetwork" to import the network as a dlnetwork object. On the dlnetwork object, you then predict class labels by using the predict function. Specify the input data as a dlarray using the correct data format (for more information, see the fmt argument of dlarray).

Limitations

  • importONNXNetwork supports these:

    • ONNX intermediate representation version 9

    • ONNX operator sets 6–20

Note

If you import an exported network, layers of the reimported network might differ from layers of the original network, and might not be supported.

More About

collapse all

Tips

  • To use a pretrained network for prediction or transfer learning on new images, you must preprocess your images in the same way as the images that you use to train the imported model. The most common preprocessing steps are resizing images, subtracting image average values, and converting the images from BGR format to RGB format.

    • To resize images, use imresize. For example, imresize(image,[227 227 3]).

    • To convert images from RGB to BGR format, use flip. For example, flip(image,3).

    For more information about preprocessing images for training and prediction, see Preprocess Images for Deep Learning.

  • MATLAB uses one-based indexing, whereas Python® uses zero-based indexing. In other words, the first element in an array has an index of 1 and 0 in MATLAB and Python, respectively. For more information about MATLAB indexing, see Array Indexing. In MATLAB, to use an array of indices (ind) created in Python, convert the array to ind+1.

  • For more tips, see Tips on Importing Models from TensorFlow, PyTorch, and ONNX.

Alternative Functionality

Deep Learning Toolbox Converter for ONNX Model Format provides three functions to import a pretrained ONNX network: importONNXNetwork, importONNXLayers, and importONNXFunction.

If the imported network contains an ONNX operator not supported for conversion into a built-in MATLAB layer (see ONNX Operators Supported for Conversion into Built-In MATLAB Layers) and importONNXNetwork does not generate a custom layer, then importONNXNetwork returns an error. In this case, you can still use importONNXLayers to import the network architecture and weights or importONNXFunction to import the network as an ONNXParameters object and a model function.

References

[1] Open Neural Network Exchange. https://github.com/onnx/.

[2] ONNX. https://onnx.ai/.

Version History

Introduced in R2018a

expand all