> Import PyTorch, ONNX, or Keras 3 / TensorFlow 2.16+ deep learning models into MATLAB as dlnetwork objects. Use when importing .pt2 exported programs, traced .pt files, .onnx models, or Keras 3 models via matlabsaver. Covers importNetworkFromPyTorch, importNetworkFromONNX, importNetworkFromKeras, importNetworkFromTensorFlow, torch.export.export, PyTorchInputSizes, InputDataFormats, matlabsaver, tf_keras downgrade, numeric validation against PyTorch or ONNX Runtime, and placeholder/custom layer implementation. Applies when user mentions any of these functions, file formats, or encounters import errors, unsupported operator warnings, 0 learnables, or uninitialized networks.
npx skills add https://github.com/matlab/matlab-agentic-toolkit --skill matlab-import-external-ai-model
Import trained PyTorch, ONNX, or Keras 3 models into MATLAB as dlnetwork
objects and verify numerical correctness.
.pt2, .pt, .onnx, or .keras files to bring into MATLABimportNetworkFromPyTorch, importNetworkFromONNX, importNetworkFromKeras, or importNetworkFromTensorFlowtorch.export.export, torch.jit.trace, PyTorchInputSizes, InputDataFormats, or matlabsaverexportONNXNetwork / exportNetworkToPyTorch)/matlab-train-network/matlab-deploy-embedded-aiQ: What format is the source model?
|
+-- .pt2 (PyTorch exported program) ──────────> PYTORCH IMPORT below
+-- .pt (PyTorch traced model) ───────────────> PYTORCH IMPORT below
+-- .onnx ────────────────────────────────────> ONNX IMPORT below
+-- .keras / TensorFlow 2.16+ / matlabsaver ──> KERAS IMPORT below
+-- Unknown ("import my model") ──────────────> Ask: framework? file extension?
Full pipeline: export from PyTorch → import into MATLAB → validate numerics.
| User has | Action |
|----------|--------|
| PyTorch model (code or saved) | Export as .pt2 first → see references/pytorch-export-guidance.md |
| .pt2 file (exported program) | Import directly (below) |
| .pt file (traced model) | Import with input sizes (below) |
Always prefer .pt2 over .pt. If user has a traced model, recommend re-exporting
with torch.export.export first. Only use traced path if re-export is not feasible.
net = importNetworkFromPyTorch("model.pt2");
No input size argument needed — shape info is embedded in the .pt2 file.
net = importNetworkFromPyTorch("model.pt", ...
PyTorchInputSizes=[1 3 224 224]);
PyTorchInputSizes is mandatory for traced models. Specify sizes in PyTorch
dimension ordering. For multiple inputs use a cell array: {[1 3 256 256], [1 10]}.
| Argument | When to use |
|----------|-------------|
| PyTorchInputSizes | Required for traced models (.pt). Not needed for .pt2 |
| Namespace | Control where auto-generated custom layer files are stored |
| PreferredNestingType | Choose "networklayer" (default) or "customlayer" |
| Mistake | Correct Approach |
|---------|-----------------|
| Using InputShape NV argument | Does not exist — use PyTorchInputSizes for .pt, nothing for .pt2 |
| Using PackageName NV argument | Deprecated — use Namespace |
| Not calling model.to("cpu") before export | Always model.to("cpu") before export |
| Not checking PyTorch version before export | Assert torch.__version__ starts with "2.8" |
| Passing PyTorchInputSizes for .pt2 | Unnecessary — .pt2 embeds shape info, omit it |
| Guessing input size for unknown models | Always ask the user for exact input dimensions |
| Assuming net.InputNames matches forward() order | Importer may reorder — always check net.InputNames |
model.to("cpu") and model.eval() before exportNamespace not PackageName for custom layer storagetorch.export.export over torch.jit.tracereferences/pytorch-export-guidance.md — Full Python-side export procedurereferences/pytorch-import-guidance.md — Detailed MATLAB import for both formatsreferences/pytorch-numeric-validation.md — Dimension conversion and tolerance comparisonreferences/pytorch-placeholder-guidance.md — Implementing unsupported ops in custom layersscripts/validateImportedNetwork.m — Helper function for numeric validation against .npy reference dataImport ONNX models using importNetworkFromONNX, diagnose issues, verify numerics.
1. IMPORT → importNetworkFromONNX with appropriate NVPs
2. DIAGNOSE → Check initialization, custom layers, warnings
3. RESOLVE → Fix issues (InputDataFormats, placeholder functions)
4. VERIFY → Compare outputs against ONNX Runtime (if installed)
CRITICAL: Do NOT re-import after step 3. Re-importing regenerates +ops/ and overwrites all custom implementations.
net = importNetworkFromONNX("model.onnx");
If you know the input format:
net = importNetworkFromONNX("model.onnx", InputDataFormats="BCSS");
If net.Initialized is false, read the input shape and re-import with InputDataFormats:
net = importNetworkFromONNX("model.onnx");
if ~net.Initialized
inputLayer = net.Layers(1);
fprintf("NumDims: %d\n", inputLayer.NumDims);
end
Characters: B (batch), C (channel), S (spatial), T (time), U (unspecified).
| ONNX Input Shape | InputDataFormats |
|-----------------|------------------|
| [N, C, H, W] | "BCSS" |
| [N, C] | "BC" |
| [N, T, C] | "BTC" |
| [N, C, T] | "BCT" |
If onnxruntime is installed in the user's Python environment, compare outputs. If not installed, skip — do not ask the user to install it.
try
ort = py.importlib.import_module("onnxruntime");
ortAvailable = true;
catch
ortAvailable = false;
end
See references/onnx-validation-workflow.md for the full comparison procedure.
| Mistake | Correct Approach |
|---------|-----------------|
| Use importONNXNetwork or importONNXLayers | Legacy — always use importNetworkFromONNX |
| Re-import after implementing placeholders | Import once, then modify. Never re-import. |
| Guess InputDataFormats randomly | Read input shape from uninitialized network first |
| Skip numeric verification when ORT is available | Compare against ONNX Runtime if installed |
importNetworkFromONNX — never legacy APIsdlarray with explicit format strings: dlarray(data, "SSCB")references/onnx-validation-workflow.md — Full ORT comparison including multi-output modelsImport Keras 3 / TensorFlow 2.16+ models with full layer structure and learnables.
Q1: What MATLAB release is available?
+-- R2026a or newer ──> PATH 1 (matlabsaver + importNetworkFromKeras)
+-- R2025b or older ──> Q2
Q2: Does the model use Keras 3-specific features? (keras.ops, multi-backend)
+-- No (standard layers) ──> PATH 2 (tf_keras downgrade)
+-- Yes ────────────────────> PATH 3 (ONNX export fallback)
Python:
import matlabsaver
matlabsaver.save_for_matlab(model, "exportedModelFolder")
Apply the config.json patch for Keras 3.10+ compatibility (see references/keras-matlabsaver-workflow.md).
MATLAB:
net = importNetworkFromKeras("exportedModelFolder");
assert(numel(net.Learnables.Value) > 0, "Import failed: 0 learnables")
Python:
import os
os.environ["TF_USE_LEGACY_KERAS"] = "1" # MUST be before importing TensorFlow
import tf_keras as keras
model.save("savedModelFolder")
MATLAB:
net = importNetworkFromTensorFlow("savedModelFolder");
Requires tf2onnx in the Python environment: pip install tf2onnx
Python:
model.export("exportedModel.onnx", format="onnx")
MATLAB:
net = importNetworkFromONNX("exportedModel.onnx");
| Mistake | Correct Approach |
|---------|-----------------|
| importNetworkFromKeras fails with "Brace indexing..." | Keras 3.10+ changed config.json — apply the patch (see reference) |
| model.export("folder") then importNetworkFromTensorFlow | No keras_metadata.pb → 0 learnables. Use matlabsaver instead |
| TF_USE_LEGACY_KERAS=1 set after import tensorflow | Must be set before any TF import |
| Using deprecated importKerasNetwork | Use importNetworkFromKeras (R2026a+) or Path 2/3 |
references/keras-matlabsaver-workflow.md — Full matlabsaver procedure for R2026a+references/keras-tf-keras-downgrade.md — tf_keras setup for pre-R2026a| Function | Framework | Purpose |
|----------|-----------|---------|
| importNetworkFromPyTorch | PyTorch | Import .pt2 or .pt as dlnetwork |
| importNetworkFromONNX | ONNX | Import .onnx as dlnetwork |
| importNetworkFromKeras | Keras | Import Keras 3 folder as dlnetwork (R2026a+) |
| importNetworkFromTensorFlow | TF/Keras | Import TF SavedModel as dlnetwork |
| torch.export.export | PyTorch | Export model as .pt2 (Python) |
| matlabsaver.save_for_matlab | Keras | Export Keras 3 for MATLAB (Python) |
| predict | All | Run inference on imported dlnetwork |
| dlarray | All | Labeled multi-dimensional array for deep learning |
----
Copyright 2026 The MathWorks, Inc.
----
Create new skills, modify and improve existing skills, and measure skill performance. Use when users want to create a skill from scratch, edit, or optimize an existing skill, run evals to test a skill, benchmark skill performance with variance analysis, or optimize a skill's description for better triggering accuracy.
Access NCBI GEO for gene expression/genomics data. Search/download microarray and RNA-seq datasets (GSE, GSM, GPL), retrieve SOFT/Matrix files, for transcriptomics and expression analysis.
Bayesian modeling with PyMC. Build hierarchical models, MCMC (NUTS), variational inference, LOO/WAIC comparison, posterior checks, for probabilistic programming and inference.
Multi-objective optimization framework. NSGA-II, NSGA-III, MOEA/D, Pareto fronts, constraint handling, benchmarks (ZDT, DTLZ), for engineering design and optimization problems.
Statistical modeling toolkit. OLS, GLM, logistic, ARIMA, time series, hypothesis tests, diagnostics, AIC/BIC, for rigorous statistical inference and econometric analysis.
Add unsigned integer (uint) type support to PyTorch operators by updating AT_DISPATCH macros. Use when adding support for uint16, uint32, uint64 types to operators, kernels, or when user mentions enabling unsigned types, barebones unsigned types, or uint support.
Convert PyTorch AT_DISPATCH macros to AT_DISPATCH_V2 format in ATen C++ code. Use when porting AT_DISPATCH_ALL_TYPES_AND*, AT_DISPATCH_FLOATING_TYPES*, or other dispatch macros to the new v2 API. For ATen kernel files, CUDA kernels, and native operator implementations.
Write docstrings for PyTorch functions and methods following PyTorch conventions. Use when writing or updating docstrings in PyTorch code.
Take matlab/matlab-import-external-ai-model from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.
The instructions reference pip.
Without those the skill loads but fails at the first command.