importONNXLayers
ONNX ネットワークからの層のインポート
説明
は、ファイル lgraph
= importONNXLayers(modelfile
)modelfile
から事前学習済みの ONNX™ (Open Neural Network Exchange) ネットワークの層と重みをインポートします。この関数は、DAGNetwork
オブジェクトまたは dlnetwork
オブジェクトと互換性のある LayerGraph
オブジェクトとして lgraph
を返します。
importONNXLayers
には、Deep Learning Toolbox™ Converter for ONNX Model Format サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、importONNXLayers
によってダウンロード用リンクが表示されます。
メモ
既定では、ソフトウェアが ONNX 演算子をそれと等価な組み込みの MATLAB® 層に変換できないときに、importONNXLayers
がカスタム層の生成を試みます。ソフトウェアによる変換がサポートされている演算子の一覧については、組み込みの MATLAB 層への変換がサポートされている ONNX 演算子を参照してください。
importONNXLayers
は、生成されたカスタム層をパッケージ +
に保存します。modelfile
importONNXLayers
は、組み込みの MATLAB 層への変換がサポートされていない各 ONNX 演算子のカスタム層を自動生成しません。サポートされていない層の処理方法の詳細については、ヒントを参照してください。
は、1 つ以上の名前と値の引数で指定された追加オプションを使用して、ONNX ネットワークから層と重みをインポートします。たとえば、lgraph
= importONNXLayers(modelfile
,Name=Value
)OutputLayerType="classification"
は DAGNetwork
オブジェクトと互換性のある層グラフをインポートしますが、その際、インポートされたネットワーク アーキテクチャの最初の出力分岐の末尾に分類出力層が追加されます。
例
Deep Learning Toolbox Converter for ONNX Model Format のダウンロードとインストール
Deep Learning Toolbox Converter for ONNX Model Format サポート パッケージをダウンロードしてインストールします。
コマンド ラインで importONNXLayers
と入力します。
importONNXLayers
Deep Learning Toolbox Converter for ONNX Model Format がインストールされていない場合、この関数は、必要なサポート パッケージへのリンクをアドオン エクスプローラーに表示します。サポート パッケージをインストールするには、リンクをクリックして、[インストール] をクリックします。コマンド ラインでモデル ファイル "simplenet.onnx"
からネットワークをインポートして、インストールが正常に終了していることを確認します。サポート パッケージがインストールされている場合、この関数は LayerGraph
オブジェクトを返します。
modelfile = "simplenet.onnx";
lgraph = importONNXLayers(modelfile)
lgraph = LayerGraph with properties: Layers: [9×1 nnet.cnn.layer.Layer] Connections: [8×2 table] InputNames: {'imageinput'} OutputNames: {'ClassificationLayer_softmax1002'}
ネットワーク アーキテクチャをプロットします。
plot(lgraph)
DAGNetwork
と互換性のある層グラフとしての ONNX モデルのインポート
事前学習済みの ONNX ネットワークを LayerGraph
オブジェクトとしてインポートします。次に、インポートした層を組み立てて DAGNetwork
オブジェクトを作成し、組み立てたネットワークを使用してイメージを分類します。
squeezenet
畳み込みニューラル ネットワークの ONNX モデルを生成します。
squeezeNet = squeezenet;
exportONNXNetwork(squeezeNet,"squeezeNet.onnx");
モデル ファイルとクラス名を指定します。
modelfile = "squeezenet.onnx";
ClassNames = squeezeNet.Layers(end).Classes;
ONNX ネットワークの層と重みをインポートします。既定では、importONNXLayers
は DAGNetwork
オブジェクトと互換性のある LayerGraph
オブジェクトとしてネットワークをインポートします。
lgraph = importONNXLayers(modelfile)
lgraph = LayerGraph with properties: Layers: [70×1 nnet.cnn.layer.Layer] Connections: [77×2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_prob'}
インポートしたネットワーク アーキテクチャを解析します。
analyzeNetwork(lgraph)
インポートしたネットワークの最後の層を表示します。出力を見ると、この層グラフのネットワーク アーキテクチャの末尾に ClassificationOutputLayer
があることがわかります。
lgraph.Layers(end)
ans = ClassificationOutputLayer with properties: Name: 'ClassificationLayer_prob' Classes: 'auto' ClassWeights: 'none' OutputSize: 'auto' Hyperparameters LossFunction: 'crossentropyex'
分類層にはクラスが含まれていないため、ネットワークを組み立てる前にそれを指定しなければなりません。クラスを指定しない場合、クラスは 1
、2
、...、N
に自動的に設定されます。ここで、N
はクラスの数です。
分類層の名前は 'ClassificationLayer_prob'
です。クラスを ClassNames
に設定してから、インポートした分類層を新しい層に置き換えます。
cLayer = lgraph.Layers(end);
cLayer.Classes = ClassNames;
lgraph = replaceLayer(lgraph,'ClassificationLayer_prob',cLayer);
assembleNetwork
を使用して層グラフを組み立て、DAGNetwork
オブジェクトを返します。
net = assembleNetwork(lgraph)
net = DAGNetwork with properties: Layers: [70×1 nnet.cnn.layer.Layer] Connections: [77×2 table] InputNames: {'data'} OutputNames: {'ClassificationLayer_prob'}
分類するイメージを読み取り、そのイメージのサイズを表示します。このイメージは 384 x 512 ピクセルで 3 つのカラー チャネル (RGB) があります。
I = imread("peppers.png");
size(I)
ans = 1×3
384 512 3
イメージのサイズをネットワークの入力サイズに変更します。イメージを表示します。
I = imresize(I,[227 227]); imshow(I)
インポートしたネットワークを使用してイメージを分類します。
label = classify(net,I)
label = categorical
bell pepper
dlnetwork
と互換性のある層グラフとしての ONNX モデルのインポート
事前学習済みの ONNX ネットワークを、dlnetwork
オブジェクトと互換性のある LayerGraph
オブジェクトとしてインポートします。その後、層グラフを dlnetwork
に変換してイメージを分類します。
squeezenet
畳み込みニューラル ネットワークの ONNX モデルを生成します。
squeezeNet = squeezenet;
exportONNXNetwork(squeezeNet,"squeezeNet.onnx");
モデル ファイルとクラス名を指定します。
modelfile = "squeezenet.onnx";
ClassNames = squeezeNet.Layers(end).Classes;
ONNX ネットワークの層と重みをインポートします。ネットワークを dlnetwork
オブジェクトと互換性がある LayerGraph
オブジェクトとしてインポートするよう指定します。
lgraph = importONNXLayers(modelfile,TargetNetwork="dlnetwork")
lgraph = LayerGraph with properties: Layers: [70×1 nnet.cnn.layer.Layer] Connections: [77×2 table] InputNames: {'data'} OutputNames: {1×0 cell}
分類するイメージを読み取り、そのイメージのサイズを表示します。このイメージは 384 x 512 ピクセルで 3 つのカラー チャネル (RGB) があります。
I = imread("peppers.png");
size(I)
ans = 1×3
384 512 3
イメージのサイズをネットワークの入力サイズに変更します。イメージを表示します。
I = imresize(I,[227 227]); imshow(I)
インポートした層グラフを dlnetwork
オブジェクトに変換します。
dlnet = dlnetwork(lgraph);
イメージを dlarray
に変換します。イメージを次元 "SSCB"
(spatial、spatial、channel、batch) で書式設定します。この場合、バッチ サイズは 1 であるため、バッチ サイズを省略できます ("SSC"
)。
I_dlarray = dlarray(single(I),"SSCB");
サンプル イメージを分類し、予測されたラベルを見つけます。
prob = predict(dlnet,I_dlarray); [~,label] = max(prob);
分類結果を表示します。
ClassNames(label)
ans = categorical
bell pepper
層グラフとしての ONNX モデルのインポートとカスタム層の自動生成
事前学習済みの ONNX ネットワークを LayerGraph
オブジェクトとしてインポートし、インポートした層を組み立てて DAGNetwork
オブジェクトを作成します。その後、DAGNetwork
を使用してイメージを分類します。インポートしたネットワークには、組み込みの MATLAB 層への変換がサポートされていない ONNX 演算子が含まれています。これらの演算子をインポートすると、カスタム層がソフトウェアによって自動生成されます。
この例では、補助関数 findCustomLayers
を使用します。この関数のコードを見るには、補助関数を参照してください。
ONNX Model Zoo の演算子セット 9 と共にインポートするファイルを、shufflenet
として指定します。shufflenet
は、ImageNet データベースの 100 万個を超えるイメージで学習させた畳み込みニューラル ネットワークです。結果として、このネットワークは広範囲のイメージに対する豊富な特徴表現を学習しています。このネットワークは、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マウス、鉛筆、多くの動物など) に分類できます。
modelfile = "shufflenet-9.onnx";
shufflenet
の層と重みをインポートします。既定では、importONNXLayers
は DAGNetwork
オブジェクトと互換性のある LayerGraph
オブジェクトとしてネットワークをインポートします。インポートしたネットワークに、組み込みの MATLAB 層への変換がサポートされていない ONNX 演算子が含まれている場合、importONNXLayers
は、これらの層の代わりにカスタム層を自動生成できます。importONNXLayers
は、生成した各カスタム層を、現在のフォルダー内のパッケージ +shufflenet_9
に個別の .m
ファイルとして保存します。名前と値の引数 PackageName
を使用して、パッケージ名を指定します。
lgraph = importONNXLayers(modelfile,PackageName="shufflenet_9")
lgraph = LayerGraph with properties: Layers: [173×1 nnet.cnn.layer.Layer] Connections: [188×2 table] InputNames: {'gpu_0_data_0'} OutputNames: {'ClassificationLayer_gpu_0_softmax_1'}
補助関数 findCustomLayers
を使用して、自動生成されたカスタム層のインデックスを見つけ、このカスタム層を表示します。
ind = findCustomLayers(lgraph.Layers,'+shufflenet_9');
lgraph.Layers(ind)
ans = 16×1 Layer array with layers: 1 'Reshape_To_ReshapeLayer1004' shufflenet_9.Reshape_To_ReshapeLayer1004 shufflenet_9.Reshape_To_ReshapeLayer1004 2 'Reshape_To_ReshapeLayer1009' shufflenet_9.Reshape_To_ReshapeLayer1009 shufflenet_9.Reshape_To_ReshapeLayer1009 3 'Reshape_To_ReshapeLayer1014' shufflenet_9.Reshape_To_ReshapeLayer1014 shufflenet_9.Reshape_To_ReshapeLayer1014 4 'Reshape_To_ReshapeLayer1019' shufflenet_9.Reshape_To_ReshapeLayer1019 shufflenet_9.Reshape_To_ReshapeLayer1019 5 'Reshape_To_ReshapeLayer1024' shufflenet_9.Reshape_To_ReshapeLayer1024 shufflenet_9.Reshape_To_ReshapeLayer1024 6 'Reshape_To_ReshapeLayer1029' shufflenet_9.Reshape_To_ReshapeLayer1029 shufflenet_9.Reshape_To_ReshapeLayer1029 7 'Reshape_To_ReshapeLayer1034' shufflenet_9.Reshape_To_ReshapeLayer1034 shufflenet_9.Reshape_To_ReshapeLayer1034 8 'Reshape_To_ReshapeLayer1039' shufflenet_9.Reshape_To_ReshapeLayer1039 shufflenet_9.Reshape_To_ReshapeLayer1039 9 'Reshape_To_ReshapeLayer1044' shufflenet_9.Reshape_To_ReshapeLayer1044 shufflenet_9.Reshape_To_ReshapeLayer1044 10 'Reshape_To_ReshapeLayer1049' shufflenet_9.Reshape_To_ReshapeLayer1049 shufflenet_9.Reshape_To_ReshapeLayer1049 11 'Reshape_To_ReshapeLayer1054' shufflenet_9.Reshape_To_ReshapeLayer1054 shufflenet_9.Reshape_To_ReshapeLayer1054 12 'Reshape_To_ReshapeLayer1059' shufflenet_9.Reshape_To_ReshapeLayer1059 shufflenet_9.Reshape_To_ReshapeLayer1059 13 'Reshape_To_ReshapeLayer1064' shufflenet_9.Reshape_To_ReshapeLayer1064 shufflenet_9.Reshape_To_ReshapeLayer1064 14 'Reshape_To_ReshapeLayer1069' shufflenet_9.Reshape_To_ReshapeLayer1069 shufflenet_9.Reshape_To_ReshapeLayer1069 15 'Reshape_To_ReshapeLayer1074' shufflenet_9.Reshape_To_ReshapeLayer1074 shufflenet_9.Reshape_To_ReshapeLayer1074 16 'Reshape_To_ReshapeLayer1079' shufflenet_9.Reshape_To_ReshapeLayer1079 shufflenet_9.Reshape_To_ReshapeLayer1079
分類層にはクラスが含まれていないため、ネットワークを組み立てる前にそれを指定しなければなりません。クラスを指定しない場合、クラスは 1
、2
、...、N
に自動的に設定されます。ここで、N
はクラスの数です。
同じく ImageNet データベースのイメージで学習させたsqueezenet
から、クラス名をインポートします。
SqueezeNet = squeezenet; classNames = SqueezeNet.Layers(end).ClassNames;
分類層 cLayer
は、lgraph
の最後の層です。クラスを classNames
に設定してから、インポートした分類層を新しい層に置き換えます。
cLayer = lgraph.Layers(end)
cLayer = ClassificationOutputLayer with properties: Name: 'ClassificationLayer_gpu_0_softmax_1' Classes: 'auto' ClassWeights: 'none' OutputSize: 'auto' Hyperparameters LossFunction: 'crossentropyex'
cLayer.Classes = classNames; lgraph = replaceLayer(lgraph,lgraph.Layers(end).Name,cLayer);
assembleNetwork
を使用して層グラフを組み立てます。この関数は、予測に使用する準備が整った DAGNetwork
オブジェクトを返します。
net = assembleNetwork(lgraph)
net = DAGNetwork with properties: Layers: [173×1 nnet.cnn.layer.Layer] Connections: [188×2 table] InputNames: {'gpu_0_data_0'} OutputNames: {'ClassificationLayer_gpu_0_softmax_1'}
分類するイメージを読み取り、そのイメージのサイズを表示します。このイメージは 792 x 1056 ピクセルで、3 つのカラー チャネル (RGB) があります。
I = imread("peacock.jpg");
size(I)
ans = 1×3
792 1056 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]);
インポートしたネットワークを使用してイメージを分類します。
label = classify(net,I)
label = categorical
peacock
補助関数
この節では、この例で使用されている補助関数 findCustomLayers
のコードを示します。findCustomLayers
は、importONNXLayers
によって自動生成されたカスタム層の indices
を返します。
function indices = findCustomLayers(layers,PackageName) s = what(['.\' PackageName]); indices = zeros(1,length(s.m)); for i = 1:length(layers) for j = 1:length(s.m) if strcmpi(class(layers(i)),[PackageName(2:end) '.' s.m{j}(1:end-2)]) indices(j) = i; end end end end
プレースホルダーを含む ONNX モデルの層グラフとしてのインポート
ONNX 長短期記憶 (LSTM) ネットワークを層グラフとしてインポートし、プレースホルダー層を検索して置換します。LSTM ネットワークでは、シーケンス データをネットワークに入力し、シーケンス データの個々のタイム ステップに基づいて予測を行うことができます。
lstmNet
は、深層学習を使用したシーケンスの分類で作成した LSTM ネットワークと同様のアーキテクチャとなっています。lstmNet
は、続けて発音された 2 つの日本語の母音を表す時系列データに対してその話者を認識するように学習が行われています。
lstmNet
をモデル ファイルとして指定します。
modelfile = "lstmNet.onnx";
ONNX ネットワークの層と重みをインポートします。既定では、importONNXLayers
は DAGNetwork
オブジェクトと互換性のある LayerGraph
オブジェクトとしてネットワークをインポートします。
lgraph = importONNXLayers("lstmNet.onnx")
Warning: Unable to import some ONNX operators, because they are not supported. They have been replaced by placeholder layers. To find these layers, call the function findPlaceholderLayers on the returned object. 1 operators(s) : Unable to create an output layer for the ONNX network output 'softmax1001' because its data format is unknown or unsupported by MATLAB output layers. If you know its format, pass it using the 'OutputDataFormats' argument. To import the ONNX network as a function, use importONNXFunction.
lgraph = LayerGraph with properties: Layers: [6×1 nnet.cnn.layer.Layer] Connections: [5×2 table] InputNames: {'sequenceinput'} OutputNames: {1×0 cell}
importONNXLayers
は、警告を表示して出力層のプレースホルダー層を挿入します。
プレースホルダー層を確認するには、lgraph
の Layers
プロパティを表示するか、関数findPlaceholderLayers
を使用します。
lgraph.Layers
ans = 6×1 Layer array with layers: 1 'sequenceinput' Sequence Input Sequence input with 12 dimensions 2 'lstm1000' LSTM LSTM with 100 hidden units 3 'fc_MatMul' Fully Connected 9 fully connected layer 4 'fc_Add' Elementwise Affine Applies an elementwise scaling followed by an addition to the input. 5 'Flatten_To_SoftmaxLayer1005' lstmNet.Flatten_To_SoftmaxLayer1005 lstmNet.Flatten_To_SoftmaxLayer1005 6 'OutputLayer_softmax1001' PLACEHOLDER LAYER Placeholder for 'added_outputLayer' ONNX operator
placeholderLayers = findPlaceholderLayers(lgraph)
placeholderLayers = PlaceholderLayer with properties: Name: 'OutputLayer_softmax1001' ONNXNode: [1×1 struct] Weights: [] Learnable Parameters No properties. State Parameters No properties. Show all properties
プレースホルダー層と置き換える出力層を作成します。まず、OutputLayer_softmax1001
という名前の分類層を作成します。クラスを指定しない場合、クラスは 1
、2
、...、N
に自動的に設定されます。ここで、N
はクラスの数です。今回の場合、クラス データは、9 人の話者に対応するラベル "1"、"2"、...、"9" から成る categorical ベクトルです。
outputLayer = classificationLayer('Name','OutputLayer_softmax1001');
関数replaceLayer
を使用して、プレースホルダー層を outputLayer
に置き換えます。
lgraph = replaceLayer(lgraph,'OutputLayer_softmax1001',outputLayer);
層グラフの Layers
プロパティを表示して置き換えを確認します。
lgraph.Layers
ans = 6×1 Layer array with layers: 1 'sequenceinput' Sequence Input Sequence input with 12 dimensions 2 'lstm1000' LSTM LSTM with 100 hidden units 3 'fc_MatMul' Fully Connected 9 fully connected layer 4 'fc_Add' Elementwise Affine Applies an elementwise scaling followed by an addition to the input. 5 'Flatten_To_SoftmaxLayer1005' lstmNet.Flatten_To_SoftmaxLayer1005 lstmNet.Flatten_To_SoftmaxLayer1005 6 'OutputLayer_softmax1001' Classification Output crossentropyex
または、OutputLayerType
オプションか OutputDataFormats
オプションを使用して層グラフをインポートするときに出力層を定義します。findPlaceholderLayers
を使用して、インポートした層グラフにプレースホルダー層が含まれているかどうかを確認します。
lgraph1 = importONNXLayers("lstmNet.onnx",OutputLayerType="classification"); findPlaceholderLayers(lgraph1)
ans = 0×1 Layer array with properties:
lgraph2 = importONNXLayers("lstmNet.onnx",OutputDataFormats="BC"); findPlaceholderLayers(lgraph2)
ans = 0×1 Layer array with properties:
インポートした層グラフ lgraph1
および lgraph2
には、プレースホルダー層が含まれていません。
複数の出力をもつ ONNX ネットワークのインポートと組み立て
importONNXLayers
を使用して複数の出力をもつ ONNX ネットワークをインポートし、インポートした層グラフを組み立てて DAGNetwork
オブジェクトを作成します。
層と重みのインポート元となるネットワーク ファイルを指定します。
modelfile = "digitsMIMO.onnx";
modelfile
から層と重みをインポートします。digitsMIMO.onnx
内のネットワークには 2 つの出力層があります。1 つは数字を分類する分類層 (ClassificationLayer_sm_1
)、1 つは数字の予測角度の平均二乗誤差を計算する回帰層 (RegressionLayer_fc_1_Flatten
) です。
lgraph = importONNXLayers(modelfile)
lgraph = LayerGraph with properties: Layers: [19×1 nnet.cnn.layer.Layer] Connections: [19×2 table] InputNames: {'input'} OutputNames: {'ClassificationLayer_sm_1' 'RegressionLayer_fc_1_Flatten'}
plot
を使用して層グラフをプロットし、lgraph
の層を表示します。
plot(lgraph)
lgraph.Layers
ans = 19×1 Layer array with layers: 1 'input' Image Input 28×28×1 images 2 'conv_1' Convolution 16 5×5×1 convolutions with stride [1 1] and padding [2 2 2 2] 3 'BN_1' Batch Normalization Batch normalization with 16 channels 4 'relu_1' ReLU ReLU 5 'conv_2' Convolution 32 1×1×16 convolutions with stride [2 2] and padding [0 0 0 0] 6 'conv_3' Convolution 32 3×3×16 convolutions with stride [2 2] and padding [1 1 1 1] 7 'BN_2' Batch Normalization Batch normalization with 32 channels 8 'relu_2' ReLU ReLU 9 'conv_4' Convolution 32 3×3×32 convolutions with stride [1 1] and padding [1 1 1 1] 10 'BN_3' Batch Normalization Batch normalization with 32 channels 11 'relu_3' ReLU ReLU 12 'plus_1' Addition Element-wise addition of 2 inputs 13 'fc_1' Convolution 1 14×14×32 convolutions with stride [1 1] and padding [0 0 0 0] 14 'fc_2' Convolution 10 14×14×32 convolutions with stride [1 1] and padding [0 0 0 0] 15 'sm_1_Flatten' ONNX Flatten Flatten activations into 1-D assuming C-style (row-major) order 16 'sm_1' Softmax softmax 17 'fc_1_Flatten' ONNX Flatten Flatten activations into 1-D assuming C-style (row-major) order 18 'ClassificationLayer_sm_1' Classification Output crossentropyex 19 'RegressionLayer_fc_1_Flatten' Regression Output mean-squared-error
分類層にはクラスが含まれていないため、ネットワークを組み立てる前にそれを指定しなければなりません。クラスを指定しない場合、クラスは 1
、2
、...、N
に自動的に設定されます。ここで、N
はクラスの数です。cLayer
のクラスを、0
、1
、...、9
として指定します。その後、インポートした分類層を新しい層に置き換えます。
ClassNames = string(0:9);
cLayer = lgraph.Layers(18);
cLayer.Classes = ClassNames;
lgraph = replaceLayer(lgraph,"ClassificationLayer_sm_1",cLayer);
assembleNetwork
を使用して層グラフを組み立てます。この関数は、予測に使用する準備が整った DAGNetwork
オブジェクトを返します。
assembledNet = assembleNetwork(lgraph)
assembledNet = DAGNetwork with properties: Layers: [19×1 nnet.cnn.layer.Layer] Connections: [19×2 table] InputNames: {'input'} OutputNames: {'ClassificationLayer_sm_1' 'RegressionLayer_fc_1_Flatten'}
入力引数
modelfile
— ONNX モデル ファイルの名前
文字ベクトル | string スカラー
ネットワークを含む ONNX モデル ファイルの名前。文字ベクトルまたは string スカラーとして指定します。ファイルは、現在のフォルダーまたは MATLAB パス上のフォルダーに含まれていなければならず、そうでなければこのファイルの絶対パスまたは相対パスを含めなければなりません。
例: "cifarResNet.onnx"
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN
として指定します。ここで、Name
は引数名で、Value
は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: importONNXLayers(modelfile,TargetNetwork="dagnetwork",GenerateCustomLayers=true,PackageName="CustomLayers")
は、modelfile
内のネットワーク層を DAGNetwork
オブジェクトと互換性のある層グラフとしてインポートし、自動生成したカスタム層を現在のフォルダー内のパッケージ +CustomLayers
に保存します。
GenerateCustomLayers
— カスタム層の生成オプション
true
または 1
(既定値) | false
または 0
カスタム層の生成オプション。数値または logical 1
(true
) または logical 0
(false
) として指定します。GenerateCustomLayers
を true
に設定した場合、ソフトウェアが ONNX 演算子をそれと等価な組み込みの MATLAB 層に変換できないときに、importONNXLayers
がカスタム層の生成を試みます。importONNXLayers
は、生成した各カスタム層を、+
で個別の PackageName
.m
ファイルとして保存します。カスタム層を表示または編集するには、関連する .m
ファイルを開きます。カスタム層の詳細については、カスタム層を参照してください。
例: GenerateCustomLayers=false
PackageName
— カスタム層パッケージの名前
文字ベクトル | string スカラー
importONNXLayers
がカスタム層を保存するパッケージの名前。文字ベクトルまたは string スカラーとして指定します。importONNXLayers
は、カスタム層のパッケージ +
を現在のフォルダーに保存します。PackageName
PackageName
を指定しない場合、importONNXLayers
は、カスタム層を現在のフォルダー内の +
という名前のパッケージに保存します。パッケージの詳細については、パッケージによる名前空間の作成を参照してください。modelfile
例: PackageName="shufflenet_9"
例: PackageName="CustomLayers"
TargetNetwork
— Deep Learning Toolbox ネットワークのターゲット タイプ
"dagnetwork"
(既定値) | "dlnetwork"
インポートしたネットワーク アーキテクチャの Deep Learning Toolbox ネットワークのターゲット タイプ。"dagnetwork"
または "dlnetwork"
として指定します。関数 importONNXLayers
は、DAGNetwork
オブジェクトまたは dlnetwork
オブジェクトと互換性のある LayerGraph
オブジェクトとしてネットワーク アーキテクチャをインポートします。
TargetNetwork
を"dagnetwork"
として指定した場合、インポートされるlgraph
には、ONNX モデルで指定されるか、名前と値の引数InputDataFormats
、OutputDataFormats
またはOutputLayerType
で指定した入力層と出力層を含めなければなりません。TargetNetwork
を"dlnetwork"
として指定した場合、importONNXLayers
によってlgraph
の各出力分岐の末尾にCustomOutputLayer
が追加され、場合によっては入力分岐の先頭にCustomInputLayer
が追加されます。入力のデータ形式または入力のイメージ サイズが不明の場合は、この関数によりCustomInputLayer
が追加されます。これらの層のデータ形式に関するネットワーク固有の情報については、CustomInputLayer
オブジェクトおよびCustomOutputLayer
オブジェクトのプロパティを参照してください。Deep Learning Toolbox の入出力データ形式を解釈する方法の詳細については、ONNX 入出力テンソルから組み込みの MATLAB 層への変換を参照してください。
例: TargetNetwork="dlnetwork"
は、dlnetwork
オブジェクトと互換性のある LayerGraph
オブジェクトをインポートします。
InputDataFormats
— ネットワーク入力のデータ形式
文字ベクトル | string スカラー | string 配列
ネットワーク入力のデータ形式。文字ベクトル、string スカラー、または string 配列として指定します。importONNXLayers
は、入力データ形式を ONNX ファイルから解釈しようと試みます。importONNXLayers
が入力データ形式を導出できない場合、名前と値の引数 InputDataFormats
が役に立ちます。
InputDataFomats
には、ONNX 入力テンソルの順にデータ形式を設定します。たとえば、InputDataFormats
を "BSSC"
として指定した場合、インポートされたネットワークは 1 つの imageInputLayer
入力をもちます。importONNXLayers
が ONNX 入力テンソルのデータ形式を解釈する方法、およびさまざまな Deep Learning Toolbox 入力層について InputDataFormats
を指定する方法の詳細については、ONNX 入出力テンソルから組み込みの MATLAB 層への変換を参照してください。
空のデータ形式 ([]
または ""
) を指定した場合、importONNXLayers
は入力データ形式を自動的に解釈します。
例: InputDataFormats='BSSC'
例: InputDataFormats="BSSC"
例: InputDataFormats=["BCSS","","BC"]
例: InputDataFormats={'BCSS',[],'BC'}
データ型: char
| string
| cell
OutputDataFormats
— ネットワーク出力のデータ形式
文字ベクトル | string スカラー | string 配列
ネットワーク出力のデータ形式。文字ベクトル、string スカラー、または string 配列として指定します。importONNXLayers
は、出力データ形式を ONNX ファイルから解釈しようと試みます。importONNXLayers
が出力データ形式を導出できない場合、名前と値の引数 OutputDataFormats
が役に立ちます。
OutputDataFormats
には、ONNX 出力テンソルの順にデータ形式を設定します。たとえば、OutputDataFormats
を "BC"
として指定した場合、インポートされたネットワークは 1 つの classificationLayer
出力をもちます。importONNXLayers
が ONNX 出力テンソルのデータ形式を解釈する方法、およびさまざまな Deep Learning Toolbox 出力層について OutputDataFormats
を指定する方法の詳細については、ONNX 入出力テンソルから組み込みの MATLAB 層への変換を参照してください。
空のデータ形式 ([]
または ""
) を指定した場合、importONNXLayers
は出力データ形式を自動的に解釈します。
例: OutputDataFormats='BC'
例: OutputDataFormats="BC"
例: OutputDataFormats=["BCSS","","BC"]
例: OutputDataFormats={'BCSS',[],'BC'}
データ型: char
| string
| cell
ImageInputSize
— 最初のネットワーク入力の入力イメージのサイズ
2 個または 3 個の数値のベクトル
最初のネットワーク入力の入力イメージのサイズ。2 次元イメージの [height,width,channels]
または 3 次元イメージの [height,width,depth,channels]
にそれぞれ対応する、3 個または 4 個の数値のベクトルとして指定します。modelfile
の ONNX モデルで入力サイズが指定されていない場合にのみ、ネットワークはこの情報を使用します。
例: ImageInputSize=[28 28 1]
(2 次元グレースケール入力イメージの場合)
例: ImageInputSize=[224 224 3]
(2 次元カラー入力イメージの場合)
例: ImageInputSize=[28 28 36 3]
(3 次元カラー入力イメージの場合)
OutputLayerType
— 最初のネットワーク出力の層のタイプ
"classification"
| "regression"
| "pixelclassification"
最初のネットワーク出力の層のタイプ。"classification"
、"regression"
、または "pixelclassification"
として指定します。関数 importONNXLayers
は、ClassificationOutputLayer
オブジェクト、RegressionOutputLayer
オブジェクト、または pixelClassificationLayer
(Computer Vision Toolbox) オブジェクトを、インポートされたネットワーク アーキテクチャの最初の出力分岐の末尾に追加します。pixelClassificationLayer
(Computer Vision Toolbox) オブジェクトを追加するには、Computer Vision Toolbox™ が必要です。modelfile
の ONNX モデルによって出力層のタイプが指定されている場合、または TargetNetwork
を "dlnetwork"
として指定した場合、importONNXLayers
は名前と値の引数 OutputLayerType
を無視します。
例: OutputLayerType="regression"
FoldConstants
— 定数畳み込みによる最適化
"deep"
(既定値) | "shallow"
| "none"
定数畳み込みによる最適化。"deep"
、"shallow"
または "none"
として指定します。定数畳み込みは、ONNX 演算子からそれと等価な組み込みの MATLAB 層への変換の際に、ONNX 初期化子 (初期定数値) に対して演算を実行することで、インポートされたネットワーク アーキテクチャを最適化します。
ソフトウェアによって等価な組み込みの MATLAB 層に変換できない演算子が ONNX ネットワークに含まれている場合 (組み込みの MATLAB 層への変換がサポートされている ONNX 演算子を参照)、importONNXLayers
は、サポートされない各層の代わりにプレースホルダー層を挿入します。詳細については、ヒントを参照してください。
定数畳み込みによる最適化を行うことで、プレースホルダー層の数を減らすことができます。FoldConstants
を "deep"
に設定した場合、インポートした層に含まれるプレースホルダー層の数は、この引数を "shallow"
に設定した場合と同じか、それより少なくなります。ただし、インポートする時間が長くなる可能性があります。ネットワーク アーキテクチャの最適化を無効にするには、FoldConstants
を "none"
に設定します。
例: FoldConstants="shallow"
出力引数
lgraph
— 事前学習済みの ONNX モデルのネットワーク アーキテクチャ
LayerGraph
オブジェクト
事前学習済みの ONNX モデルのネットワーク アーキテクチャ。LayerGraph
オブジェクトとして返されます。
インポートした層グラフを予測に使用するには、LayerGraph
オブジェクトを DAGNetwork
オブジェクトまたは dlnetwork
オブジェクトに変換しなければなりません。目的のワークフローに応じて、名前と値の引数 TargetNetwork
を "dagnetwork"
または "dlnetwork"
として指定します。
制限
importONNXLayers
でサポートされる ONNX のバージョンは、次のとおりです。この関数は、ONNX 中間表現 version 7 をサポートしています。
この関数は、ONNX 演算子セット 6 ~ 14 をサポートしています。
メモ
エクスポートしたネットワークをインポートする場合、元のネットワークとは異なるネットワークの層が再インポートされ、サポート対象外となる可能性があります。
詳細
組み込みの MATLAB 層への変換がサポートされている ONNX 演算子
importONNXLayers
は、組み込みの MATLAB 層への変換を行う次の ONNX 演算子をサポートします (いくつかの制限があります)。
* importONNXLayers
が Conv
ONNX 演算子を convolution2dLayer
としてインポートし、Conv
演算子が 2 つの要素 [p1,p2]
のみをもつベクトルである場合、importONNXLayers
は 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.IdentityLayer |
| nnet.onnx.layer.ElementwiseAffineLayer |
| nnet.onnx.layer.PReluLayer |
| 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) |
ONNX 入出力テンソルから組み込みの MATLAB 層への変換
importONNXLayers
は、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 x w x c x 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 x w x c x s x 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 層への変換
データ形式 | MATLAB 層 | |
---|---|---|
ONNX 出力テンソル | MATLAB 出力形式 | |
BC , TBC | CB , CBT | classificationLayer |
BCSS , BSSC , CSS , SSC , BCSSS , BSSSC , CSSS , SSSC | SSCB , SSSCB | pixelClassificationLayer (Computer Vision Toolbox) |
TBCSS , TBCSSS | SSCBT , SSSCBT | regressionLayer |
インポートされたネットワーク アーキテクチャ用のコードの生成
MATLAB Coder™ または GPU Coder™ を Deep Learning Toolbox と共に使用して、インポートされたネットワーク用の MEX コード、スタンドアロン CPU コード、CUDA® MEX コード、またはスタンドアロン CUDA コードを生成できます。詳細については、コード生成を参照してください。
MATLAB Coder を Deep Learning Toolbox と共に使用して、デスクトップまたは組み込みターゲットで実行される MEX コードまたはスタンドアロン CPU コードを生成します。Intel® 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)を参照してください。
importONNXLayers
は、ネットワーク アーキテクチャ lgraph
を LayerGraph
オブジェクトとして返します。コードを生成するには、まず、インポートした LayerGraph
オブジェクトをネットワークに変換しなければなりません。assembleNetwork
または dlnetwork
を使用して、LayerGraph
オブジェクトを DAGNetwork
オブジェクトまたは dlnetwork
オブジェクトに変換します。MATLAB Coder オブジェクトおよび Deep Learning Toolbox オブジェクト用の GPU Coder サポートの詳細については、サポートされているクラス (MATLAB Coder)およびサポートされているクラス (GPU Coder)をそれぞれ参照してください。
コード生成をサポートする層をもつあらゆるインポート済みネットワーク用にコードを生成できます。MATLAB Coder および GPU Coder を使用したコード生成をサポートする層のリストについては、サポートされている層 (MATLAB Coder)およびサポートされている層 (GPU Coder)をそれぞれ参照してください。各組み込み MATLAB 層のコード生成機能と制限の詳細については、各層の拡張機能の節を参照してください。例については、imageInputLayer
のコード生成とGPU コード生成を参照してください。
GPU におけるインポートしたネットワーク層の使用
GPU 上では importONNXLayers
は実行されません。ただし、importONNXLayers
は、深層学習で使用する事前学習済みのニューラル ネットワークの層を、GPU で使用可能な LayerGraph
オブジェクトとしてインポートします。
assembleNetwork
を使用して、インポートしたLayerGraph
オブジェクトをDAGNetwork
オブジェクトに変換します。DAGNetwork
オブジェクトでは、classify
を使用して、CPU または GPU でクラス ラベルを予測できます。名前と値の引数ExecutionEnvironment
を使用して、ハードウェア要件を指定します。複数の出力があるネットワークの場合、関数predict
を使用して、名前と値の引数ReturnCategorical
をtrue
として指定します。dlnetwork
を使用して、インポートしたLayerGraph
オブジェクトをdlnetwork
オブジェクトに変換します。dlnetwork
オブジェクトでは、predict
を使用して、CPU または GPU でクラス ラベルを予測できます。入力データとネットワーク パラメーターのいずれかが GPU に保存されている場合、関数predict
を GPU で実行できます。minibatchqueue
を使用して入力データのミニバッチの処理と管理を行う場合、GPU が使用可能であれば、出力はminibatchqueue
オブジェクトによって GPU 配列に変換されます。dlupdate
を使用して、dlnetwork
オブジェクトの学習可能パラメーターを GPU 配列に変換します。net = dlupdate(@gpuArray,net)
trainNetwork
を使用することにより、インポートしたLayerGraph
オブジェクトに 1 つの CPU または 1 つの GPU で学習させることができます。実行環境のオプションを含む学習オプションを指定するには、関数trainingOptions
を使用します。名前と値の引数ExecutionEnvironment
を使用して、ハードウェア要件を指定します。学習を高速化する方法の詳細については、Scale Up Deep Learning in Parallel, on GPUs, and in the Cloudを参照してください。
GPU を使用するには Parallel Computing Toolbox™ ライセンスとサポートされている GPU デバイスが必要です。サポートされているデバイスについては、GPU 計算の要件 (Parallel Computing Toolbox)を参照してください。
ヒント
インポートしたネットワークに、組み込みの MATLAB 層への変換がサポートされていない ONNX 演算子が含まれており (組み込みの MATLAB 層への変換がサポートされている ONNX 演算子を参照)、
importONNXLayers
がカスタム層を生成しない場合、importONNXLayers
はサポートされない層の代わりにプレースホルダー層を挿入します。ネットワークに含まれるサポート対象外の層の名前とインデックスを見つけるには、関数findPlaceholderLayers
を使用します。その後、プレースホルダー層を、ユーザーが定義した新しい層に置き換えることができます。層を置き換えるには、replaceLayer
を使用します。例については、複数の出力をもつ ONNX ネットワークのインポートと組み立てを参照してください。事前学習済みのネットワークを新しいイメージの予測または転移学習に使用するには、インポートしたモデルの学習に使用したイメージに行った前処理と同じようにイメージを前処理しなければなりません。最も一般的な前処理ステップは、イメージのサイズ変更、イメージの平均値の減算、イメージの BGR 形式から RGB 形式への変換です。
学習および予測用のイメージの前処理の詳細は、イメージの深層学習向け前処理を参照してください。
MATLAB は 1 ベースのインデックスを使用しますが、Python® は 0 ベースのインデックスを使用します。つまり、配列の最初の要素のインデックスは、MATLAB と Python でそれぞれ 1 と 0 になります。MATLAB インデックスの詳細については、配列インデックス付けを参照してください。MATLAB で、Python で作成されたインデックス (
ind
) の配列を使用するには、配列をind+1
に変換します。その他のヒントについては、Tips on Importing Models from TensorFlow, PyTorch, and ONNXを参照してください。
代替機能
Deep Learning Toolbox Converter for ONNX Model Format には、事前学習済みの ONNX ネットワークをインポートするための 3 つの関数 (importONNXNetwork
、importONNXLayers
、および importONNXFunction
) が用意されています。各シナリオに最適なインポート関数の詳細については、事前学習済みの ONNX ネットワークをインポートする関数の選択を参照してください。
バージョン履歴
R2018a で導入R2021b: ImportWeights
オプションは削除済み
ImportWeights
は削除されました。R2021b 以降、ONNX モデルの重みが自動的にインポートされます。多くの場合、コードを変更する必要はありません。
コード内で
ImportWeights
が設定されていない場合、importONNXLayers
によって重みがインポートされます。コード内で
ImportWeights
がtrue
に設定されている場合、importONNXLayers
の動作は以前と変わりません。コード内で
ImportWeights
がfalse
に設定されている場合、importONNXLayers
は、名前と値の引数ImportWeights
を無視して重みをインポートします。
R2021b: importONNXLayers
は ONNX ファイルの情報から入出力層を作成することが不可能
ONNX モデルを DAGNetwork
オブジェクトと互換性のある LayerGraph
オブジェクトとしてインポートする場合、インポートする層グラフには入力層と出力層が含まれていなければなりません。importONNXLayers
は、ONNX 入出力テンソルを組み込みの MATLAB 層に変換しようと試みます。これまで importONNXLayers
を使用して組み込みの MATLAB 入出力層と共にインポートできたネットワークであっても、現在はインポート時に importONNXLayers
によってプレースホルダー層が挿入される可能性があります。この場合、次のいずれかを行ってコードを更新します。
名前と値の引数
TargetNetwork
を"dlnetwork"
として指定し、ネットワークをdlnetwork
オブジェクトと互換性のあるLayerGraph
オブジェクトとしてインポート。名前と値の引数
InputDataFormats
、OutputDataFormats
、およびOutputLayerType
を使用して、インポートするネットワークの入力と出力を指定。importONNXFunction
を使用して、モデル関数およびONNXParameters
オブジェクトとしてネットワークをインポート。
R2021b: インポートされた層の名前が異なる場合がある
インポートされた層グラフの層の名前が、以前のリリースとは異なる場合があります。コードを更新するには、層の既存の名前を新しい名前または lgraph.Layers(n).Name
に置き換えます。
MATLAB コマンド
次の MATLAB コマンドに対応するリンクがクリックされました。
コマンドを MATLAB コマンド ウィンドウに入力して実行してください。Web ブラウザーは MATLAB コマンドをサポートしていません。
Select a Web Site
Choose a web site to get translated content where available and see local events and offers. Based on your location, we recommend that you select: .
You can also select a web site from the following list:
How to Get Best Site Performance
Select the China site (in Chinese or English) for best site performance. Other MathWorks country sites are not optimized for visits from your location.
Americas
- América Latina (Español)
- Canada (English)
- United States (English)
Europe
- 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)