importONNXNetwork - (To be removed) Import pretrained ONNX network - MATLAB (original) (raw)
(To be removed) Import pretrained ONNX network
Syntax
Description
[net](#mw%5F6146bb45-9c3e-4c8d-9d17-88ff260e7a2e) = importONNXNetwork([modelfile](#mw%5Fbdd2d9c2-fa42-4bb2-a8d3-873f001e2ed5%5Fsep%5Fmw%5Fbf0bcf87-a070-41f3-ba07-d8b9b2345e44))
imports a pretrained ONNX™ (Open Neural Network Exchange) network from the filemodelfile
. 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, thenimportONNXNetwork
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.
[net](#mw%5F6146bb45-9c3e-4c8d-9d17-88ff260e7a2e) = importONNXNetwork([modelfile](#mw%5Fbdd2d9c2-fa42-4bb2-a8d3-873f001e2ed5%5Fsep%5Fmw%5Fbf0bcf87-a070-41f3-ba07-d8b9b2345e44),[Name=Value](#namevaluepairarguments))
imports a pretrained ONNX network with additional options specified by one or more name-value arguments. For example,OutputLayerType="classification"
imports the network as aDAGNetwork
object with a classification output layer appended to the end of the first output branch of the imported network architecture.
Examples
Download and install the Deep Learning Toolbox Converter for ONNX Model Format support package.
Type importONNXNetwork
at the command line.
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.
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.
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)
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 = 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)
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.
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
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
Specify optional pairs of arguments asName1=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](#mw%5Fbdd2d9c2-fa42-4bb2-a8d3-873f001e2ed5%5Fsep%5Fmw%5Fa36c5ab1-de33-4d97-a738-f615ec8855d4)
. 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](#mw%5Fbdd2d9c2-fa42-4bb2-a8d3-873f001e2ed5%5Fsep%5Fmw%5Fbf0bcf87-a070-41f3-ba07-d8b9b2345e44)
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 ordlnetwork 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 argumentsInputDataFormats, OutputDataFormats, or OutputLayerType. - If you import the network as a
dlnetwork
object,importONNXNetwork
appends aCustomOutputLayer
at the end of each output branch ofnet
, and might append aCustomInputLayer
at the beginning of an input branch. The function appends aCustomInputLayer
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 theCustomInputLayer
andCustomOutputLayer
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 specifyInputDataFormats
as "BSSC"
, the imported network has one imageInputLayer
input. For more information on howimportONNXNetwork
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 specifyOutputDataFormats
as "BC"
, the imported network has one classificationLayer
output. For more information on howimportONNXNetwork
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 functionimportONNXNetwork
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 argumentOutputLayerType
.
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 vectorsstr
, then importONNXNetwork
sets the classes of the output layer to categorical(str,str)
. If you specifyTargetNetwork as "dlnetwork"
,importONNXNetwork
ignores the name-value argumentClasses
.
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 setFoldConstants
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
Pretrained ONNX network, returned as a DAGNetwork ordlnetwork object.
- Specify TargetNetwork as
"dagnetwork"
to import the network as aDAGNetwork
object. On theDAGNetwork
object, you then predict class labels by using theclassify function. - Specify
TargetNetwork
as"dlnetwork"
to import the network as adlnetwork
object. On thedlnetwork
object, you then predict class labels by using thepredict function. Specify the input data as a dlarray using the correct data format (for more information, see the fmt argument ofdlarray
).
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
importONNXNetwork
supports these ONNX operators for conversion into built-in MATLAB layers, with some limitations.
* If importONNXNetwork
imports theConv
ONNX operator as a convolution2dLayer
object and theConv
operator is a vector with only two elements[p1 p2]
, importONNXNetwork
sets thePadding
option of convolution2dLayer
to[p1 p2 p1 p2]
.
ONNX Operator | ONNX Importer Custom Layer |
---|---|
Clip | nnet.onnx.layer.ClipLayer |
Div | nnet.onnx.layer.ElementwiseAffineLayer |
Flatten | nnet.onnx.layer.FlattenLayer ornnet.onnx.layer.Flatten3dLayer |
ImageScaler | nnet.onnx.layer.ElementwiseAffineLayer |
Reshape | nnet.onnx.layer.FlattenLayer |
Sub | nnet.onnx.layer.ElementwiseAffineLayer |
importONNXNetwork
tries to interpret the data format of the ONNX network's input and output tensors, and then convert them into built-in MATLAB input and output layers. For details on the interpretation, see the tablesConversion of ONNX Input Tensors into Deep Learning Toolbox Layers and Conversion of ONNX Output Tensors into MATLAB Layers.
In Deep Learning Toolbox, each data format character must be one of these labels:
S
— SpatialC
— ChannelB
— Batch observationsT
— Time or sequenceU
— Unspecified
Conversion of ONNX Input Tensors into Deep Learning Toolbox Layers
Data Formats | Data Interpretation | Deep Learning Toolbox Layer | ||
---|---|---|---|---|
ONNX Input Tensor | MATLAB Input Format | Shape | Type | |
BC | CB | _c_-by-n array, where c is the number of features and n is the number of observations | Features | featureInputLayer |
BCSS, BSSC, CSS, SSC | SSCB | _h_-by-_w_-by-_c_-by-n numeric array, where h, w,c and n are the height, width, number of channels of the images, and number of observations, respectively | 2-D image | imageInputLayer |
BCSSS, BSSSC, CSSS, SSSC | SSSCB | _h_-by-_w_-by-_d_-by-_c_-by-n numeric array, where h, w,d, c and n are the height, width, depth, number of channels of the images, and number of image observations, respectively | 3-D image | image3dInputLayer |
TBC | CBT | c_-by-s_-by-n matrix, where_c is the number of features of the sequence,s is the sequence length, and_n is the number of sequence observations | Vector sequence | sequenceInputLayer |
TBCSS | SSCBT | _h_-by-_w_-by-_c_-by-s_-by-n array, where h, w,c and n correspond to the height, width, and number of channels of the image, respectively,s is the sequence length, and_n is the number of image sequence observations | 2-D image sequence | sequenceInputLayer |
TBCSSS | SSSCBT | _h_-by-_w_-by-_d_-by-_c_-by-s_-by-n array, where h, w,d, and c correspond to the height, width, depth, and number of channels of the image, respectively,s is the sequence length, and_n is the number of image sequence observations | 3-D image sequence | sequenceInputLayer |
Conversion of ONNX Output Tensors into MATLAB Layers
Data Formats | MATLAB Layer | |
---|---|---|
ONNX Output Tensor | MATLAB Output Format | |
BC, TBC | CB, CBT | classificationLayer |
BCSS, BSSC, CSS, SSC, BCSSS, BSSSC, CSSS, SSSC | SSCB, SSSCB | pixelClassificationLayer (Computer Vision Toolbox) |
TBCSS, TBCSSS | SSCBT, SSSCBT | regressionLayer |
You can use MATLAB Coder™ or GPU Coder™ together with Deep Learning Toolbox to generate MEX, standalone CPU, CUDA® MEX, or standalone CUDA code for an imported network. For more information, see Generate Code and Deploy Deep Neural Networks.
- Use MATLAB Coder with Deep Learning Toolbox to generate MEX or standalone CPU code that runs on desktop or embedded targets. You can deploy generated standalone code that uses the Intel® MKL-DNN library or the ARM® Compute library. Alternatively, you can generate generic C or C++ code that does not call third-party library functions. For more information, see Deep Learning with MATLAB Coder (MATLAB Coder).
- Use GPU Coder with Deep Learning Toolbox to generate CUDA MEX or standalone CUDA code that runs on desktop or embedded targets. You can deploy generated standalone CUDA code that uses the CUDA deep neural network library (cuDNN), the TensorRT™ high performance inference library, or the ARM Compute library for Mali GPU. For more information, see Deep Learning with GPU Coder (GPU Coder).
importONNXNetwork
returns the networknet as a DAGNetwork
or dlnetwork
object. Both these objects support code generation. For more information on MATLAB Coder and GPU Coder support for Deep Learning Toolbox objects, see Supported Classes (MATLAB Coder) and Supported Classes (GPU Coder), respectively.
You can generate code for any imported network whose layers support code generation. For lists of the layers that support code generation with MATLAB Coder and GPU Coder, see Supported Layers (MATLAB Coder) and Supported Layers (GPU Coder), respectively. For more information on the code generation capabilities and limitations of each built-in MATLAB layer, see the Extended Capabilities section of the layer. For example, seeCode Generation and GPU Code Generation of imageInputLayer.
importONNXNetwork
does not execute on a GPU. However, importONNXNetwork
imports a pretrained neural network for deep learning as a DAGNetwork
or dlnetwork
object, which you can use on a GPU.
- If you import the network as a
DAGNetwork
object, you can make predictions with the imported network on either a CPU or GPU by using classify. Specify the hardware requirements using the name-value argumentExecutionEnvironment
. For networks with multiple outputs, use the predict function forDAGNetwork
objects. - If you import the network as a
DAGNetwork
object, you can make predictions with the imported network on either a CPU or GPU by using predict. Specify the hardware requirements using the name-value argumentExecutionEnvironment
. If the network has multiple outputs, specify the name-value argument ReturnCategorical astrue
. - If you import the network as a
dlnetwork
object, you can make predictions with the imported network on either a CPU or GPU by using predict. The functionpredict
executes on the GPU if either the input data or network parameters are stored on the GPU.- If you use minibatchqueue to process and manage the mini-batches of input data, the
minibatchqueue
object converts the output to a GPU array by default if a GPU is available. - Use dlupdate to convert the learnable parameters of a
dlnetwork
object to GPU arrays.
net = dlupdate(@gpuArray,net)
- If you use minibatchqueue to process and manage the mini-batches of input data, the
- You can train the imported network on either a CPU or GPU by using the trainnet and trainNetwork functions. To specify training options, including options for the execution environment, use the trainingOptions function. Specify the hardware requirements using the name-value argument
ExecutionEnvironment
. For more information on how to accelerate training, see Scale Up Deep Learning in Parallel, on GPUs, and in the Cloud.
Using a GPU requires a Parallel Computing Toolbox™ license and a supported GPU device. For information about supported devices, seeGPU Computing Requirements (Parallel Computing Toolbox).
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.
- To resize images, use imresize. For example,
- 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 toind+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) andimportONNXNetwork
does not generate a custom layer, thenimportONNXNetwork
returns an error. In this case, you can still useimportONNXLayers
to import the network architecture and weights orimportONNXFunction
to import the network as an ONNXParameters object and a model function.
References
Version History
Introduced in R2018a
Starting in R2023b, the importONNXNetwork
function warns. Use importNetworkFromONNX instead. The importNetworkFromONNX
function has these advantages over importONNXNetwork
:
- Imports an ONNX model into a dlnetwork object in a single step
- Provides a simplified workflow for importing models with unknown input and output information
- Has improved name-value arguments that you can use to more easily specify import options
ClassNames
has been removed. Use Classes
instead. To update your code, replace all instances of ClassNames
withClasses
.
If you import an ONNX model as a DAGNetwork
object, the imported network must include input and output layers. importONNXNetwork
tries to convert the input and output ONNX tensors into built-in MATLAB layers. When importing some networks, which importONNXNetwork
could previously import with input and output built-in MATLAB layers, importONNXNetwork
might now return an error. In this case, do one of the following to update your code:
- Specify the name-value argument
TargetNetwork
as"dlnetwork"
to import the network as adlnetwork
object. - Use the name-value arguments
InputDataFormats
,OutputDataFormats
, andOutputLayerType
to specify the imported network's inputs and outputs. - Use importONNXLayers to import the network as a layer graph with placeholder layers.
- Use importONNXFunction to import the network as a model function and an
ONNXParameters
object.
The layer names of an imported network might differ from previous releases. To update your code, replace the existing name of a layer with the new name ornet.Layers(n).Name
.