Code Generation for dlarray - MATLAB & Simulink (original) (raw)
A deep learning array stores data with optional data format labels for custom training loops, and enables functions to compute and use derivatives through automatic differentiation. To learn more about custom training loops, automatic differentiation, and deep learning arrays, see Custom Training Loops (Deep Learning Toolbox).
Code generation supports both formatted and unformatted deep learning arrays.dlarray
objects containing gpuArrays
are also supported for code generation. To generate C/C++ code using deep learning arrays, you need to install MATLAB Coder Interface for Deep Learning. For generating and deploying CUDA® code onto NVIDIA® GPUs, you need to install GPU Coder Interface for Deep Learning. When you use deep learning arrays with CPU and GPU code generation, adhere to these restrictions:
Define dlarray
for Code Generation
For code generation, use the dlarray (Deep Learning Toolbox) function to create deep learning arrays. For example, suppose you have a pretraineddlnetwork (Deep Learning Toolbox) network object in themynet.mat
MAT file. To predict the responses for this network, create an entry-point function in MATLAB®.
There are two possibilities:
Design 1 (Not recommended)
In this design example, the input and output to the entry-point function,foo
are of dlarray
types. This type of entry-point function is not recommended for code generation because in MATLAB, dlarray
enforces the order of labels'SCBTU'
. This behavior is replicated for MEX code generation. However, for standalone code generation such as static, dynamic libraries, or executables, the data format follows the specification of the fmt
argument of the dlarray
object. As a result, if the input or output of an entry-point function is a dlarray
object and its order of labels is not 'SCBTU'
, then the data layout will be different between the MATLAB environment and standalone code.
function dlOut = foo(dlIn)
persistent dlnet; if isempty(dlnet) dlnet = coder.loadDeepLearningNetwork('mynet.mat'); end
dlOut = predict(dlnet, dlIn);
end
Design 2 (Recommended)
In this design example, the input and output to foo
are of primitive datatypes and the dlarray
object is created within the function. The extractdata (Deep Learning Toolbox) method of the dlarray
object returns the data in the dlarray
dlA
as the output of foo
. The outputa
has the same data type as the underlying data type indlA
.
When compared to Design 1
, this entry-point design has the following advantages:
- Easier integration with standalone code generation workflows such as static, dynamic libraries, or executables.
- The data format of the output from the
extractdata
function has the same order ('SCBTU'
) in both the MATLAB environment and the generated code. - Improves performance for MEX workflows.
- Simplifies Simulink® workflows using MATLAB Function blocks as Simulink does not natively support
dlarray
objects.
function a = foo(in) dlIn = dlarray(in, 'SSC');
persistent dlnet; if isempty(dlnet) dlnet = coder.loadDeepLearningNetwork('mynet.mat'); end
dlA = predict(dlnet, dlIn);
a = extractdata(dlA);
end
To see an example of dlnetwork
anddlarray
usage with GPU Coder™, see Generate Digit Images on NVIDIA GPU Using Variational Autoencoder.
Generate code for complex-valued dlarray
objects
Code generation supports complex number functions with dlarray
objects. You can pass complex-valued inputs to dlarray
-supported complex number functions and generate C/C++ and CUDA code that does not depend on third-party libraries. You can implement the complex-valued dlarray
support functionality in Simulink by using a MATLAB Function Block.
Code generation does not support passing complex-valued input to thepredict
method of dlnetwork
object. For code generation, the dlarray
input to the predict
method of the dlnetwork
object must be single
data type.
You cannot pass a complex-valued input to a MEX function if the input is specified as real during code generation time. For more usage notes and limitations of code generation support for complex data, see Code Generation for Complex Data
dlarray
Object Functions with Code Generation Support
For code generation, you are restricted to the deep learning array object functions listed in this table. For more information of usage notes and limitations, see the extended capabilities section on the reference page.
dims (Deep Learning Toolbox) | Dimension labels for dlarray |
---|---|
extractdata (Deep Learning Toolbox) | Extract data from dlarray |
finddim (Deep Learning Toolbox) | Find dimensions with specified label |
stripdims (Deep Learning Toolbox) | Remove dlarray labels |
Deep Learning Toolbox Functions with dlarray
Code Generation Support
Deep Learning Operations
Function | Description |
---|---|
avgpool (Deep Learning Toolbox) | The average pooling operation performs downsampling by dividing the input into pooling regions and computing the average value of each region. |
batchnorm (Deep Learning Toolbox) | The batch normalization operation normalizes the input data across all observations for each channel independently. To speed up training of the convolutional neural network and reduce the sensitivity to network initialization, use batch normalization between convolution and nonlinear operations such as relu (Deep Learning Toolbox). |
dlconv (Deep Learning Toolbox) | The convolution operation applies sliding filters to the input data. Use the dlconv (Deep Learning Toolbox) function for deep learning convolution, grouped convolution, and channel-wise separable convolution. |
fullyconnect (Deep Learning Toolbox) | The fully connect operation multiplies the input by a weight matrix and then adds a bias vector. |
leakyrelu (Deep Learning Toolbox) | The leaky rectified linear unit (ReLU) activation operation performs a nonlinear threshold operation, where any input value less than zero is multiplied by a fixed scale factor. |
maxpool (Deep Learning Toolbox) | The maximum pooling operation performs downsampling by dividing the input into pooling regions and computing the maximum value of each region. |
relu (Deep Learning Toolbox) | The rectified linear unit (ReLU) activation operation performs a nonlinear threshold operation, where any input value less than zero is set to zero. |
sigmoid (Deep Learning Toolbox) | The sigmoid activation operation applies the sigmoid function to the input data. |
softmax (Deep Learning Toolbox) | The softmax activation operation applies the softmax function to the channel dimension of the input data. |
MATLAB Functions with dlarray
Code Generation Support
Unary Element-wise Functions
Binary Element-wise Operators
Function | Notes and Limitations |
---|---|
complex | For the one-input syntax, the outputdlarray has the same data format as the input dlarrayFor the two-input syntax, if dlarray inputs are formatted, their data formats must match. |
minus,- | If the twodlarray inputs are formatted, then the output dlarray is formatted with a combination of both of their data formats. The function uses implicit expansion to combine the inputs. For more information, see Implicit Expansion with Data Formats (Deep Learning Toolbox). |
plus,+ | |
power,.^ | |
rdivide,./ | |
realpow | |
times,.* |
Reduction Functions
Function | Notes and Limitations |
---|---|
mean | The outputdlarray has the same data format as the input dlarray.The'omitnan' option is not supported.If the input dlarray is on the GPU, the 'native' option is not supported. |
prod | The outputdlarray has the same data format as the input dlarray.The'omitnan' option is not supported. |
sum | |
vecnorm | The outputdlarray has the same data format as the input dlarray. |
Extrema Functions
Function | Notes and Limitations |
---|---|
ceil | The outputdlarray has the same data format as the input dlarray. |
eps | The outputdlarray has the same data format as the input dlarray.Use eps(ones(‘like’, x)) to get a scalar epsilon value based on the data type of adlarray x. |
fix | The outputdlarray has the same data format as the input dlarray. |
floor | The outputdlarray has the same data format as the input dlarray. |
max | When you find the maximum or minimum elements of a single dlarray, the outputdlarray has the same data format as the input dlarray.When you find the maximum or minimum elements between two formatted dlarray inputs, the output dlarray has a combination of both of their data formats. The function uses implicit expansion to combine the inputs. For more information, see Implicit Expansion with Data Formats (Deep Learning Toolbox).The index output argument is not traced and cannot be used with automatic differentiation. For more information, see Use Automatic Differentiation In Deep Learning Toolbox (Deep Learning Toolbox). |
min | |
round | Only the syntax Y = round(X) is supported.The outputdlarray has the same data format as the input dlarray. |
Fourier Transforms
Function | Notes and Limitations |
---|---|
fft | Only unformatted input arrays are supported. |
ifft | Only unformatted input arrays are supported.When you use the 'symmetric' option, ifft treats the inputY as exactly symmetric. If you compute the derivative using automatic differentiation, then the derivative is also exactly symmetric. IfY is non-symmetric, then the function and gradient behavior might not match. To ensure that function and gradient behavior match for non-symmetric inputs, explicitly symmetrizeY. |
Other Math Operations
Function | Notes and Limitations |
---|---|
colon,: | The supported operations are: a:ba:b:cFor information on indexing into adlarray, see Indexing (Deep Learning Toolbox).All inputs must be real scalars. The outputdlarray is unformatted. |
mtimes,* | One input can be a formatted dlarray only when the other input is an unformatted scalar. In this case, the output dlarray has the same data format as the formatteddlarray input.Multiplying a dlarray with a non-dlarray sparse matrix is supported only when both inputs are non-scalar. |
pagemtimes | One input can be a formatted dlarray only when the other input is unformatted, with scalar pages. In this case, the output dlarray has the same data format as the formatteddlarray input.For code generation, each transpose option ofpagemtimes must be constant. |
pinv | |
sort |
Logical Operations
Function | Notes and Limitations |
---|---|
and,& | If the twodlarray inputs are formatted, then the output dlarray is formatted with a combination of both of their data formats. The function uses implicit expansion to combine the inputs. For more information, see Implicit Expansion with Data Formats (Deep Learning Toolbox). |
eq,== | If the twodlarray inputs are formatted, then the output dlarray is formatted with a combination of both of their data formats. The function uses implicit expansion to combine the inputs. For more information, see Implicit Expansion with Data Formats (Deep Learning Toolbox). |
ge,>= | |
gt,> | |
le,<= | |
lt,< | |
ne,~= | |
not,~ | The outputdlarray has the same data format as the input dlarray. |
or,| | If the twodlarray inputs are formatted, then the output dlarray is formatted with a combination of both of their data formats. The function uses implicit expansion to combine the inputs. For more information, see Implicit Expansion with Data Formats (Deep Learning Toolbox). |
xor |
Size Manipulation Functions
Function | Notes and Limitations |
---|---|
reshape | The output dlarray is unformatted, even if the input dlarray is formatted.For code generation, the size dimensions must be fixed size. |
squeeze | Two-dimensional dlarray objects are unaffected by squeeze. If the inputdlarray is formatted, the function removes dimension labels belonging to singleton dimensions. If the inputdlarray has more than two dimensions and its third and above dimensions are singleton, then the function discards these dimensions and their labels. |
repelem | If you use the u = repelem(v,n) syntax and specify the number of times to repeat each element inrepelem, the output dlarray is unformatted even if the inputdlarray is formatted. If you use the B = repelem(A,r1,...,rN) syntax and specify the repetition factors for each dimension in repelem, the output dlarray has the same data format as the input dlarray. |
repmat | The output dlarray has the same data format as the input dlarray. |
Transposition Operations
Function | Notes and Limitations |
---|---|
ctranspose,' | If the inputdlarray is formatted, then the labels of both dimensions must be the same. The function performs transposition implicitly, and transposes directly only if necessary for other operations. |
permute | If the input dlarray is formatted, then the permutation must be among only those dimensions that have the same label. The function performs permutations implicitly, and permutes directly only if necessary for other operations.For code generation, the dimension order must be fixed size. |
ipermute | If the input dlarray is formatted, then the permutation must be among only those dimensions that have the same label. The function performs permutations implicitly, and permutes directly only if necessary for other operations.For code generation, the dimension order must be fixed size. |
transpose,.' | If the inputdlarray is formatted, then the labels of both dimensions must be the same. The function performs transposition implicitly, and transposes directly only if necessary for other operations. |
Concatenation Functions
Function | Notes and Limitations |
---|---|
cat | Thedlarray inputs must have matching formats or be unformatted. Mixed formatted and unformatted inputs are supported. If any dlarray inputs are formatted, then the output dlarray is formatted with the same data format.For code generation, the dimension order to cat function must be fixed size. |
horzcat | |
vertcat |
Conversion Functions
Function | Notes and Limitations |
---|---|
cast | cast(dlA,newdatatype) copies the data in the dlarray dlA into a dlarray of the underlying data typenewdatatype. Thenewdatatype option must be'double','single', or'logical'. The outputdlarray is formatted with the same data format as dlA.cast(A,'like',Y) returns an array of the same type as Y. IfY is a dlarray, then the output is a dlarray that has the same underlying data type as Y. If Y is on the GPU, then the output is on the GPU. If both A andY are dlarray objects, then the output dlarray is formatted with the same data format as the inputA. |
double | The output is a dlarray that contains data of type double. |
logical | The output is a dlarray that contains data of type logical. |
single | The output is a dlarray that contains data of type single. |
Comparison Functions
Function | Notes and Limitations |
---|---|
isequal | The syntax with more than two input arguments is not supported.Two dlarray inputs are equal if the numeric data they represent are equal and if they both are either formatted with the same data format or unformatted. |
isequaln | The syntax with more than two input arguments is not supported.Two dlarray inputs are equal if the numeric data they represent are equal (treatingNaNs as equal) and if they both are either formatted with the same data format or unformatted. |
Data Type and Value Identification Functions
Size Identification Functions
Function | Notes and Limitations |
---|---|
iscolumn | This function returns true for adlarray that is a column vector, where each dimension except the first is a singleton. For example, a 3-by-1-by-1 dlarray is a column vector. |
ismatrix | This function returns true fordlarray objects with only two dimensions and for dlarray objects where each dimension except the first two is a singleton. For example, a 3-by-4-by-1dlarray is a matrix. |
isrow | This function returns true for adlarray that is a row vector, where each dimension except the second is a singleton. For example, a 1-by-3-by-1 dlarray is a row vector. |
isscalar | N/A |
isvector | This function returns true for adlarray that is a row vector or column vector. Note that isvector does not consider a 1-by-1-by-3 dlarray to be a vector. |
length | N/A |
ndims | If the input dlarray dlX is formatted, thenndims(dlX) returns the number of dimension labels, even if some of the labeled dimensions are trailing singleton dimensions. |
numel | N/A |
size | If the input dlarray dlX is formatted, thensize(dlX) returns a vector of length equal to the number of dimension labels, even if some of the labeled dimensions are trailing singleton dimensions. |
Creator Functions
Indexing
Code generation supports indexing dlarray
objects and exhibits the following behaviors:
- If you set
dlY(idx1,...,idxn) = dlX
, thendlY
anddlX
must be assignment compatible.- Size of the data must not change. Out-of-bounds assignment operation is not supported.
- The assignment statement cannot add or drop
U
labels.
- Code generation does not support deleting of parts of a
dlarray
object by usingdlX(idx1,…,idxn) = []
.
See Also
Objects
Related Examples
More About
- dlarray Limitations for Code Generation
- Define Custom Training Loops, Loss Functions, and Networks (Deep Learning Toolbox)
- Train Network Using Custom Training Loop (Deep Learning Toolbox)
- Make Predictions Using dlnetwork Object (Deep Learning Toolbox)