importNetworkFromONNX
説明
は、ファイル net
= importNetworkFromONNX(modelfile
)modelfile
から事前学習済みの Open Neural Network Exchange (ONNX™) ネットワークをインポートします。この関数は、ネットワーク net
を初期化された dlnetwork
オブジェクトとして返します。
importNetworkFromONNX
には、Deep Learning Toolbox™ Converter for ONNX Model Format サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、importNetworkFromONNX
によってダウンロード用リンクが表示されます。
メモ
importNetworkFromONNX
関数は、ONNX 層をインポートするときにカスタム層を生成できます。詳細については、Algorithms
を参照してください。関数は、生成されたカスタム層を +
modelfile
名前空間に保存します。
は、1 つ以上の名前と値の引数で指定された追加オプションを使用して、事前学習済みの ONNX ネットワークをインポートします。たとえば、net
= importNetworkFromONNX(modelfile
,Name=Value
)Namespace="CustomLayers"
は、生成されたカスタム層と関連する関数を現在のフォルダーの +CustomLayers
名前空間に保存します。
例
事前学習済みの ONNX ネットワークを dlnetwork
オブジェクトとしてインポートし、インポートしたネットワークを使用してイメージを分類します。
SqueezeNet 畳み込みニューラル ネットワークの ONNX モデルを生成します。
[squeezeNet,ClassNames] = imagePretrainedNetwork("squeezenet"); exportONNXNetwork(squeezeNet,"squeezeNet.onnx");
事前学習済みの squeezeNet.onnx
モデルをインポートします。
net = importNetworkFromONNX("squeezeNet.onnx")
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: {'prob_flatten_ReshapeOutput'} Initialized: 1 View summary with summary.
分類するイメージを読み取り、そのイメージのサイズを表示します。イメージのサイズは 384×512 ピクセルで、3 つのカラー チャネル (RGB) があります。
I = imread("peppers.png");
size(I)
ans = 1×3
384 512 3
イメージのサイズをネットワークの入力サイズに変更します。イメージを表示します。
net.Layers(1).InputSize
ans = 1×3
227 227 3
I = imresize(I,[227 227]); imshow(I)
イメージを dlarray
オブジェクトに変換します。イメージを次元 "SSCB"
(spatial、spatial、channel、batch) で形式を整えます。この場合、バッチ サイズは 1 であるため、バッチ サイズを省略できます ("SSC"
)。
I_dlarray = dlarray(single(I),"SSC");
サンプル イメージを分類し、予測されたラベルを見つけます。
prob = predict(net,I_dlarray); [~,label] = max(prob);
分類結果を表示します。
ClassNames(label)
ans = "bell pepper"
事前学習済みの ONNX ネットワークをインポートします。これは、初期化されていないネットワークになります。次に、ネットワークを初期化します。
モデル ファイルを指定し、importNetworkFromONNX
関数を使用してモデルをインポートします。このモデルには不明な形式またはサイズの入力層があるため、関数はモデルを未初期化の dlnetwork
オブジェクトとしてインポートします。ソフトウェアによって、ネットワークを初期化する方法を説明する警告が表示されます。
ScalarOutputModel = 'dScalarGraphOutput.onnx';
net = importNetworkFromONNX(ScalarOutputModel);
Warning: Returning an uninitialized dlnetwork because some input layers have unknown data formats or undetermined image sizes. Initialize the network by passing example input data to the initialize object function.
net.Initialized
ans = logical
0
カスタム入力層は、必要な入力情報を検索する方法を説明します。
net.Layers
ans = 4×1 Layer array with layers: 1 'input_1' Custom input ('UUU') See the InputInformation property to find the required input dimension ordering for this layer. 2 'Transpose_To_SoftmaxLayer1000' dScalarGraphOutput.Transpose_To_SoftmaxLayer1000 dScalarGraphOutput.Transpose_To_SoftmaxLayer1000 3 'x16Output' Custom output ('UUU') See the OutputInformation property to find the output dimension ordering that is produced by this layer. 4 'x19Output' Custom output ('UU') See the OutputInformation property to find the output dimension ordering that is produced by this layer.
net.Layers(1).InputInformation
ans = "Layer input must be a labeled dlarray with the dimension order shown in the ONNX model file. You must pass the size: (1, 1, 320) The dlarray must have a format string consisting of one 'U' for each dimension: 'dlarray(data, 'UUU')'"
必要なサイズのラベル付き dlarray
サンプル入力を作成し、ネットワークを初期化します。
X = dlarray(rand(1, 1, 320), 'UUU');
net = initialize(net, X);
summary(net)
Initialized: true Number of learnables: 53.7k Inputs: 1 'input_1' Initialized using data of size 1×1×320 (UUU)
事前学習済みの ONNX ネットワークを dlnetwork
オブジェクトとしてインポートし、インポートしたネットワークを使用して前処理済みのイメージを分類します。
ONNX Model Zoo の演算子セット 9 と共にインポートするモデル ファイルを、shufflenet
として指定します。shufflenet
は、ImageNet データベースの 100 万個を超えるイメージで学習させた畳み込みニューラル ネットワークです。結果として、このネットワークは広範囲のイメージに対する豊富な特徴表現を学習しています。このネットワークは、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。
modelfile = "shufflenet-9.onnx";
同じく ImageNet データベースのイメージで学習させた SqueezeNet から、クラス名をインポートします。
[~,ClassNames] = imagePretrainedNetwork("squeezenet");
shufflenet
をインポートします。既定では、importNetworkFromONNX
はネットワークを dlnetwork
オブジェクトとしてインポートします。カスタム層を shufflenet_9
として保存する名前空間を指定します。
net = importNetworkFromONNX(modelfile,Namespace="shufflenet_9")
net = dlnetwork with properties: Layers: [174×1 nnet.cnn.layer.Layer] Connections: [189×2 table] Learnables: [198×3 table] State: [98×3 table] InputNames: {'gpu_0_data_0'} OutputNames: {'gpu_0_softmax_1Output'} Initialized: 1 View summary with summary.
分類するイメージを読み取り、そのイメージのサイズを表示します。イメージのサイズは 792×1056 ピクセルで、3 つのカラー チャネル (RGB) があります。
I = imread("peacock.jpg");
size(I)
ans = 1×3
792 1056 3
ネットワークの入力サイズを確認し、入力イメージのサイズを変更します。サイズ変更されたイメージを表示します。
net.Layers(1).InputSize
ans = 1×3
224 224 3
I = imresize(I,[224 224]); imshow(I)
shufflenet
への入力をさらに前処理する必要があります (詳細については、ONNX Model Zoo の ShuffleNet を参照)。イメージを再スケーリングします。学習イメージの平均を減算し、学習イメージの標準偏差で除算して、イメージを正規化します。
I = rescale(I,0,1); meanIm = [0.485 0.456 0.406]; stdIm = [0.229 0.224 0.225]; I = (I - reshape(meanIm,[1 1 3]))./reshape(stdIm,[1 1 3]); imshow(I)
インポートしたネットワークを使用してイメージを分類します。
prob = predict(net,I); [~,label] = max(prob); ClassNames{label}
ans = 'peacock'
ソフトウェアによって組み込みの MATLAB 層に変換できない演算子を含む、事前学習済みの ONNX ネットワークをインポートします。このネットワークをインポートすると、ソフトウェアによって自動的にカスタム層が生成されます。
この例では、findCustomLayers
補助関数を使用します。この関数のコードを見るには、補助関数を参照してください。
ONNX Model Zoo の演算子セット 9 と共にインポートするモデル ファイルを、shufflenet
として指定します。shufflenet
は、ImageNet データベースの 100 万個を超えるイメージで学習させた畳み込みニューラル ネットワークです。結果として、このネットワークは広範囲のイメージに対する豊富な特徴表現を学習しています。このネットワークは、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。
modelfile = "shufflenet-9.onnx";
shufflenet
をインポートします。既定では、importNetworkFromONNX
はネットワークを dlnetwork
オブジェクトとしてインポートします。importNetworkFromONNX
は、生成された各カスタム層を現在のフォルダーの +shufflenet_9
名前空間内の個別の M ファイルに保存します。
net = importNetworkFromONNX(modelfile,Namespace="shufflenet_9")
net = dlnetwork with properties: Layers: [174×1 nnet.cnn.layer.Layer] Connections: [189×2 table] Learnables: [198×3 table] State: [98×3 table] InputNames: {'gpu_0_data_0'} OutputNames: {'gpu_0_softmax_1Output'} Initialized: 1 View summary with summary.
findCustomLayers
補助関数を使用して、自動生成されたカスタム層のインデックスを見つけ、そのカスタム層を表示します。
ind = findCustomLayers(net.Layers,'+shufflenet_9');
net.Layers(ind)
ans = 16×1 Layer array with layers: 1 'Reshape_To_ReshapeLayer1285' shufflenet_9.Reshape_To_ReshapeLayer1285 shufflenet_9.Reshape_To_ReshapeLayer1285 2 'Reshape_To_ReshapeLayer1290' shufflenet_9.Reshape_To_ReshapeLayer1290 shufflenet_9.Reshape_To_ReshapeLayer1290 3 'Reshape_To_ReshapeLayer1295' shufflenet_9.Reshape_To_ReshapeLayer1295 shufflenet_9.Reshape_To_ReshapeLayer1295 4 'Reshape_To_ReshapeLayer1300' shufflenet_9.Reshape_To_ReshapeLayer1300 shufflenet_9.Reshape_To_ReshapeLayer1300 5 'Reshape_To_ReshapeLayer1305' shufflenet_9.Reshape_To_ReshapeLayer1305 shufflenet_9.Reshape_To_ReshapeLayer1305 6 'Reshape_To_ReshapeLayer1310' shufflenet_9.Reshape_To_ReshapeLayer1310 shufflenet_9.Reshape_To_ReshapeLayer1310 7 'Reshape_To_ReshapeLayer1315' shufflenet_9.Reshape_To_ReshapeLayer1315 shufflenet_9.Reshape_To_ReshapeLayer1315 8 'Reshape_To_ReshapeLayer1320' shufflenet_9.Reshape_To_ReshapeLayer1320 shufflenet_9.Reshape_To_ReshapeLayer1320 9 'Reshape_To_ReshapeLayer1325' shufflenet_9.Reshape_To_ReshapeLayer1325 shufflenet_9.Reshape_To_ReshapeLayer1325 10 'Reshape_To_ReshapeLayer1330' shufflenet_9.Reshape_To_ReshapeLayer1330 shufflenet_9.Reshape_To_ReshapeLayer1330 11 'Reshape_To_ReshapeLayer1335' shufflenet_9.Reshape_To_ReshapeLayer1335 shufflenet_9.Reshape_To_ReshapeLayer1335 12 'Reshape_To_ReshapeLayer1340' shufflenet_9.Reshape_To_ReshapeLayer1340 shufflenet_9.Reshape_To_ReshapeLayer1340 13 'Reshape_To_ReshapeLayer1345' shufflenet_9.Reshape_To_ReshapeLayer1345 shufflenet_9.Reshape_To_ReshapeLayer1345 14 'Reshape_To_ReshapeLayer1350' shufflenet_9.Reshape_To_ReshapeLayer1350 shufflenet_9.Reshape_To_ReshapeLayer1350 15 'Reshape_To_ReshapeLayer1355' shufflenet_9.Reshape_To_ReshapeLayer1355 shufflenet_9.Reshape_To_ReshapeLayer1355 16 'Reshape_To_ReshapeLayer1360' shufflenet_9.Reshape_To_ReshapeLayer1360 shufflenet_9.Reshape_To_ReshapeLayer1360
補助関数
このセクションでは、findCustomLayers
補助関数を定義します。findCustomLayers
は、importNetworkFromONNX
によって自動的に生成されるカスタム層のインデックスを返します。
function indices = findCustomLayers(layers,Namespace) s = what(['.\' Namespace]); indices = zeros(1,length(s.m)); for i = 1:length(layers) for j = 1:length(s.m) if strcmpi(class(layers(i)),[Namespace(2:end) '.' s.m{j}(1:end-2)]) indices(j) = i; end end end end
入力引数
ONNX モデル ファイルの名前。文字ベクトルまたは string スカラーとして指定します。modelfile
は、現在のフォルダー内になければならず、それ以外の場合はこのファイルの絶対パスまたは相対パスを含めなければなりません。
例: "cifarResNet.onnx"
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: importNetworkFromONNX(modelfile,InputDataFormats="BCSS")
は、modelfile
内のネットワークを dlnetwork
オブジェクトとしてインポートします。ONNX ネットワークへの各入力の次元順序は、バッチ、チャネル、空間、空間になります。
importNetworkFromONNX
がカスタム層を保存するカスタム層名前空間の名前。文字ベクトルまたは string スカラーとして指定します。importNetworkFromONNX
は、カスタム層の名前空間 +
を現在のフォルダーに保存します。Namespace
Namespace
を指定しない場合、importNetworkFromONNX
は、カスタム層を現在のフォルダー内の +
という名前の名前空間に保存します。名前空間の詳細については、名前空間の作成を参照してください。modelfile
例: Namespace="shufflenet_9"
例: Namespace="CustomLayers"
ONNX ネットワーク入力のデータ形式。文字ベクトル、string スカラー、または string 配列として指定します。importNetworkFromONNX
は、入力データ形式を ONNX ファイルから解釈しようと試みます。importNetworkFromONNX
が入力データ形式を判別できない場合、この名前と値の引数を使用します。
InputDataFomats
には、ONNX 入力テンソルの順にデータ形式を設定します。たとえば、InputDataFormats
を "BCSS"
(バッチ チャネル 空間 空間) として指定した場合、インポートされた MATLAB® ネットワークには 1 つの imageInputLayer
入力が含まれ、各入力の次元順序は "SSCB"
(空間 空間 チャネル バッチ) になります。importNetworkFromONNX
が ONNX 入力テンソルのデータ形式を解釈する方法、およびさまざまな Deep Learning Toolbox 入力層について InputDataFormats
を指定する方法の詳細については、ONNX 入力テンソルから Deep Learning Toolbox 層への変換を参照してください。
空のデータ形式 ([]
または ""
) を指定した場合、importNetworkFromONNX
は入力データ形式を自動的に解釈します。
例: InputDataFormats='BCSS'
例: InputDataFormats="BCSS"
例: InputDataFormats=["BCSS","","BC"]
例: InputDataFormats={'BCSS',[],'BC'}
データ型: char
| string
| cell
ONNX ネットワーク出力のデータ形式。文字ベクトル、string スカラー、または string 配列として指定します。importNetworkFromONNX
は、出力データ形式を ONNX ファイルから解釈しようと試みます。importNetworkFromONNX
が出力データ形式を判別できない場合、この名前と値の引数を使用します。
OutputDataFormats
には、ONNX 出力テンソルの順にデータ形式を設定します。たとえば、OutputDataFormats
を "BC"
(バッチ、チャネル) として指定した場合、インポートされた MATLAB ネットワークには 1 つの nnet.onnx.layer.CustomOutputLayer
出力が含まれ、各出力の次元順序は "CB"
(チャネル、バッチ) になります。importNetworkFromONNX
が ONNX 出力テンソルのデータ形式を解釈する方法、およびさまざまな Deep Learning Toolbox 出力形式について OutputDataFormats
を指定する方法の詳細については、ONNX 出力テンソルから MATLAB 出力形式への変換を参照してください。
空のデータ形式 ([]
または ""
) を指定した場合、importNetworkFromONNX
は出力データ形式を自動的に解釈します。
例: OutputDataFormats='BC'
例: OutputDataFormats="BC"
例: OutputDataFormats=["BCSS","","BC"]
例: OutputDataFormats={'BCSS',[],'BC'}
データ型: char
| string
| cell
R2025a 以降
自動生成されたカスタム層のコーダー ファイルを生成するフラグ。logical の 1(true)
または 0(false)
として指定します。GenerateCoderFiles=true
の場合、importNetworkFromONNX
は Namespace
で示されるカスタム層名前空間内に +
名前空間を生成します。coder
+
名前空間には、汎用 C/C++ コード生成に使用される MATLAB Coder™ 互換のカスタム層と演算子が含まれています。コード生成を行わない場合は、ONNX ネットワークのインポートを高速化するために、coder
GenerateCoderFiles=false
を指定してコーダー ファイルの生成を無効にします。
自動生成されたカスタム層としてインポートされた層がネットワークにない場合、コーダー ファイルは生成されません。
コード生成の詳細については、深層学習ネットワーク向けの汎用 C/C++ コードの生成 (MATLAB Coder)を参照してください。
例: GenerateCoderFiles=false
データ型: logical
出力引数
事前学習済みの ONNX ネットワーク。dlnetwork
オブジェクトとして返されます。場合によっては、ソフトウェアがデータ形式やサイズを入力できなかったり、ONNX 演算子をプレースホルダー関数としてインポートできなかったりして、ネットワークが初期化されないことがあります。その場合は、initialize
関数を使用してネットワークを初期化しなければなりません。このネットワークで predict
関数を使用することで、クラス ラベルを予測できます。正しいデータ形式を使用して、入力データを dlarray
オブジェクトとして指定します。詳細については、dlarray
の fmt
引数を参照してください。
制限
importNetworkFromONNX
は以下をサポートします。ONNX 中間表現 version 9
ONNX 演算子セット 6 ~ 20
メモ
エクスポートしたネットワークをインポートする場合、元のネットワークの層とは異なるネットワークの層が再インポートされ、サポート対象外となる可能性があります。
詳細
importNetworkFromONNX
は、組み込みの MATLAB 層への変換を行う次の ONNX 演算子をサポートします (いくつかの制限があります)。
* importNetworkFromONNX
が Conv
ONNX 演算子を convolution2dLayer
オブジェクトとしてインポートし、Conv
演算子が 2 つの要素 [p1 p2]
のみをもつベクトルである場合、importNetworkFromONNX
は convolution2dLayer
の Padding
オプションを [p1 p2 p1 p2]
に設定します。
ONNX 演算子 | ONNX インポーター カスタム層 |
---|---|
| nnet.onnx.layer.ClipLayer |
| nnet.onnx.layer.ElementwiseAffineLayer |
| nnet.onnx.layer.FlattenLayer または nnet.onnx.layer.Flatten3dLayer |
| nnet.onnx.layer.ElementwiseAffineLayer |
| nnet.onnx.layer.FlattenLayer |
| nnet.onnx.layer.ElementwiseAffineLayer |
ONNX 演算子 | 対応する Image Processing Toolbox™ の層 |
---|---|
DepthToSpace | depthToSpace2dLayer (Image Processing Toolbox) |
Resize | resize2dLayer (Image Processing Toolbox) または resize3dLayer (Image Processing Toolbox) |
SpaceToDepth | spaceToDepthLayer (Image Processing Toolbox) |
Upsample | resize2dLayer (Image Processing Toolbox) または resize3dLayer (Image Processing Toolbox) |
importNetworkFromONNX
は、ONNX ネットワークの入出力テンソルのデータ形式を解釈し、それらを組み込みの MATLAB 入力層と出力形式に変換しようと試みます。解釈の詳細については、ONNX 入力テンソルから Deep Learning Toolbox 層への変換およびONNX 出力テンソルから MATLAB 出力形式への変換を参照してください。
Deep Learning Toolbox では、各データ形式の文字は次のラベルのいずれかでなければなりません。
S
— 空間C
— チャネルB
— バッチ観測値T
— 時間またはシーケンスU
— 指定なし
ONNX 入力テンソルから Deep Learning Toolbox 層への変換
データ形式 | データの解釈 | Deep Learning Toolbox の層 | ||
---|---|---|---|---|
ONNX 入力テンソル | MATLAB 入力形式 | 形状 | 種類 | |
BC | CB | c 行 n 列の配列。ここで、c は特徴の数、n は観測値の数です。 | 特徴 | featureInputLayer |
BCSS , BSSC , CSS , SSC | SSCB | h×w×c×n の数値配列。ここで、h、w、c、および n は、それぞれイメージの高さ、幅、チャネル数、および観測値の数です。 | 2 次元イメージ | imageInputLayer |
BCSSS , BSSSC , CSSS , SSSC | SSSCB | h×w×d×c×n の数値配列。ここで、h、w、d、c、および n は、それぞれイメージの高さ、幅、深さ、チャネル数、およびイメージの観測値の数です。 | 3 次元イメージ | image3dInputLayer |
TBC | CBT | c x s x n の行列。ここで、c はシーケンスの特徴の数、s はシーケンス長、n はシーケンスの観測値の数です。 | ベクトル シーケンス | sequenceInputLayer |
TBCSS | SSCBT | h×w×c×s×n の配列。ここで、h、w、c、および n は、それぞれイメージの高さ、幅、およびチャネル数に対応し、s はシーケンス長、n はイメージ シーケンスの観測値の数です。 | 2 次元イメージ シーケンス | sequenceInputLayer |
TBCSSS | SSSCBT | h x w x d x c x s x n の配列。ここで、h、w、d、および c は、それぞれイメージの高さ、幅、深さ、およびチャネル数に対応し、s はシーケンス長、n はイメージ シーケンスの観測値の数です。 | 3 次元イメージ シーケンス | sequenceInputLayer |
ONNX 出力テンソルから MATLAB 出力形式への変換
データ形式 | |
---|---|
ONNX 出力テンソル | MATLAB 出力形式 |
BC , TBC | CB , CBT |
BCSS , BSSC , CSS , SSC , BCSSS , BSSSC , CSSS , SSSC | SSCB , SSSCB |
TBCSS , TBCSSS | SSCBT , SSSCBT |
MATLAB Coder ソフトウェアまたは GPU Coder™ ソフトウェアを Deep Learning Toolbox ソフトウェアと共に使用して、インポートされたネットワーク用の MEX コード、スタンドアロン CPU コード、CUDA® MEX コード、またはスタンドアロン CUDA コードを生成できます。詳細については、コード生成と深層ニューラル ネットワークの展開を参照してください。
MATLAB Coder を Deep Learning Toolbox と共に使用して、デスクトップまたは組み込みターゲットで実行される MEX コードまたはスタンドアロン CPU コードを生成します。Intel® Math Kernel Library for Deep Neural Networks (MKL-DNN) または ARM® Compute ライブラリを使用する、生成済みのスタンドアロン コードを展開できます。あるいは、サードパーティ ライブラリの関数を呼び出さない汎用の C/C++ コードを生成することもできます。詳細については、MATLAB Coder を使用した深層学習 (MATLAB Coder)を参照してください。
GPU Coder を Deep Learning Toolbox と共に使用して、デスクトップまたは組み込みターゲットで実行される CUDA MEX コードまたはスタンドアロン CUDA コードを生成します。CUDA 深層ニューラル ネットワーク ライブラリ (cuDNN)、TensorRT™ 高性能推論ライブラリ、または Mali GPU 向け ARM Compute ライブラリを使用する生成済みのスタンドアロン CUDA コードを展開できます。詳細については、GPU Coder を使用した深層学習 (GPU Coder)を参照してください。
importNetworkFromONNX
は、ネットワーク net
を dlnetwork
オブジェクトとして返します。このオブジェクトはコード生成をサポートします。Deep Learning Toolbox オブジェクト用の MATLAB Coder および GPU Coder サポートの詳細については、サポートされているクラス (MATLAB Coder)およびサポートされているクラス (GPU Coder)をそれぞれ参照してください。
コード生成をサポートする層をもつあらゆるインポート済みネットワーク用にコードを生成できます。MATLAB Coder および GPU Coder を使用したコード生成をサポートする層のリストについては、サポートされている層 (MATLAB Coder)およびサポートされている層 (GPU Coder)をそれぞれ参照してください。各組み込み MATLAB 層のコード生成機能と制限の詳細については、各層の「拡張機能」のセクションを参照してください。例については、imageInputLayer
のコード生成とGPU コード生成を参照してください。
GPU 上では importNetworkFromONNX
は実行されません。ただし、importNetworkFromONNX
は、深層学習用の事前学習済みニューラル ネットワークを、GPU で使用可能な dlnetwork
オブジェクトとしてインポートします。
ネットワークを
dlnetwork
オブジェクトとしてインポートした場合、predict
を使用して、インポートしたネットワークによる予測を CPU または GPU で実行できます。入力データまたはネットワーク パラメーターを GPU に保存した場合、predict
関数は GPU 上で実行されます。minibatchqueue
を使用して入力データのミニバッチの処理と管理を行う場合、GPU が使用可能であれば、出力はminibatchqueue
オブジェクトによって GPU 配列に変換されます。dlupdate
を使用して、dlnetwork
オブジェクトの学習可能なパラメーターを GPU 配列に変換します。net = dlupdate(@gpuArray,net)
trainnet
を使用して、CPU または GPU で、インポート済みのネットワークに学習させることができます。実行環境のオプションを含む学習オプションを指定するには、関数trainingOptions
を使用します。名前と値の引数ExecutionEnvironment
を使用して、ハードウェア要件を指定します。学習を高速化する方法の詳細については、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloudを参照してください。
GPU を使用するには Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスの詳細については、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。
ヒント
事前学習済みのネットワークを新しいイメージの予測または転移学習に使用するには、インポートしたモデルの学習に使用したイメージと同じようにイメージを前処理しなければなりません。最も一般的な前処理ステップは、イメージのサイズ変更、イメージの平均値の減算、イメージの BGR 形式から RGB 形式への変換です。
学習および予測用のイメージの前処理の詳細については、イメージの深層学習向け前処理を参照してください。
+
名前空間の親フォルダーが MATLAB パス上にない場合、その名前空間のメンバー (カスタムの層および演算子) にアクセスすることはできません。詳細については、名前空間と MATLAB パスを参照してください。Namespace
MATLAB は 1 ベースのインデックスを使用しますが、Python® は 0 ベースのインデックスを使用します。つまり、配列の最初の要素のインデックスは、MATLAB と Python でそれぞれ 1 と 0 になります。MATLAB のインデックスの詳細については、配列インデックス付けを参照してください。MATLAB で、Python で作成されたインデックス (
ind
) の配列を使用するには、配列をind+1
に変換します。その他のヒントについては、Tips on Importing Models from TensorFlow, PyTorch, and ONNXを参照してください。
アルゴリズム
importNetworkFromONNX
関数は、次の手順を順番に試して ONNX 演算子を MATLAB にインポートします。
関数は、ONNX 演算子を組み込みの MATLAB 層としてインポートすることを試みます。詳細については、組み込みの MATLAB 層への変換がサポートされている ONNX 演算子を参照してください。
関数は、ONNX 演算子をカスタム層としてインポートすることを試みます。
importNetworkFromONNX
は、生成されたカスタム層および関連する関数を+
名前空間に保存します。例については、自動生成されたカスタム層をもつ ONNX ネットワークのインポートを参照してください。Namespace
関数は、プレースホルダー関数を含むカスタム層として ONNX 演算子をインポートします。プレースホルダー関数は、ネットワークを使用する前に補完しなければなりません。
これらの手順を実行してもネットワークがインポートされない場合は、importONNXFunction
関数を使用できます。importONNXFunction
は、ネットワーク パラメーターを含む ONNXParameters
オブジェクトと、ネットワーク アーキテクチャを含むモデル関数としてモデルをインポートします。
場合によっては、インポートしたネットワークを初期化する必要があることがソフトウェアによって示されます。
代替機能
ブロック
ONNX Model Predict ブロックを使用して ONNX ネットワークを扱うこともできます。このブロックを使用すると、ONNX 関数を読み込んでデータを前処理および後処理したり、入力端子と出力端子を対話的に構成したりすることもできます。
参照
[1] GitHub. “Open Neural Network Exchange.” Accessed July 3, 2023. https://github.com/onnx/.
[2] "ONNX | Home.” Accessed July 3, 2023. https://onnx.ai/.
バージョン履歴
R2023b で導入自動生成されたカスタム層の汎用 C/C++ コード生成で使用される MATLAB Coder 互換ファイルを生成できるようになりました。MATLAB Coder ファイルは、新しい名前と値の引数 GenerateCoderFiles
を使用して既定で生成されます。
Deep Learning Toolbox 層には、次の ONNX 演算子をインポートできます。
Gelu
はgeluLayer
としてインポートされます。Add
、Mul
、Sub
、Neg
、およびDiv
は、scalingLayer
としてインポートされます。
次の ONNX HardSwish
演算子をカスタム層にインポートできます。
importNetworkFromONNX は、ONNX 演算子セット 6 ~ 20 をサポートします。
カスタム層とサポートされていない演算子のプレースホルダーを生成するネットワークをインポートするときに、+modelfile/+ops
名前空間にある生成されたプレースホルダー関数テンプレートでプレースホルダー関数を 1 回定義できるようになりました。自動生成されたカスタム層には、以前の汎用的な PLACEHODLER
関数呼び出しの代わりに、特定のプレースホルダー関数呼び出しも含まれます。たとえば、生成されたプレースホルダー関数テンプレート onnxAcos.m
には以下が含まれます。
function varargout = onnxAcos(varargin) % Placeholder function implementation for ONNX operator: Acos error("Operator function 'Acos' is not supported. The placeholder function 'onnxAcos.m' must be implemented before the network can be used."); end
% Execute the operators: % PLACEHOLDER FUNCTION FOR UNSUPPORTED OPERATOR (Acos): [output] = modelfile.ops.onnxAcos(input);
% Execute the operators: % PLACEHOLDER FUNCTION FOR UNSUPPORTED OPERATOR (Acos): [output] = PLACEHOLDER(input);
importNetworkFromONNX
関数では、自動生成されたカスタム層表現の内部最適化により、インポートされたネットワークを使用した下流の推論でのパフォーマンスが改善されています。これらのパフォーマンスの改善は、モデルが大きいほど顕著であり、カスタム層コードもより簡潔になります。たとえば、次のコードでの推論予測は、以前のリリースよりも約 1.4 倍高速です。
url = "https://github.com/onnx/models/raw/main/Computer_Vision/" + ... "convnext_base_Opset18_torch_hub/convnext_base_Opset18.onnx"; filename = "convnext_base_Opset18.onnx"; websave(filename,url,weboptions("Timeout",10)); function timingTest(net,x) net.predict(x); end net = importNetworkFromONNX('convnext_base_Opset18.onnx'); x = dlarray(rand([1,3,224,224], 'single'), "BCSS"); % input image f = @()timingTest(net, x); for i = 1:10 timeit(f) % the first 5 runs are inference warmup rounds end % the recorded time uses the mean of the next 5 runs
おおよその実行時間は次のとおりです。
R2025a: 0.62 秒
R2024b: 0.92 秒
このコードは、Windows® 11 を使用する Intel Xeon® W-2133CPU @ 3.6 GHz テスト システムで関数 timeit
を呼び出すことによって計測されました。
Deep Learning Toolbox 層には、次の ONNX 演算子をインポートできます。
LayerNormalization
PRelu
Identity
カスタム層には、次の ONNX 演算子をインポートできます。
Bernoulli
GatherND
GridSample
Mod
ReduceL1
ReduceLogSum
ReduceLogSumExp
ReduceSumSquare
importNetworkFromONNX は、ONNX 中間表現 version 9 と ONNX 演算子セット 6 ~ 18 をサポートします。
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)