メインコンテンツ

importONNXLayers

(削除予定) ONNX ネットワークからの層のインポート

importONNXLayers は将来のリリースで削除される予定です。代わりに importNetworkFromONNX を使用してください。 (R2023b 以降)コードの更新の詳細については、バージョン履歴を参照してください。

説明

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 演算子のカスタム層を自動生成しません。サポートされていない層の処理方法の詳細については、ヒントを参照してください。

lgraph = importONNXLayers(modelfile,Name=Value) は、1 つ以上の名前と値の引数で指定された追加オプションを使用して、ONNX ネットワークから層と重みをインポートします。たとえば、OutputLayerType="classification"DAGNetwork オブジェクトと互換性のある層グラフをインポートしますが、その際、インポートされたネットワーク アーキテクチャの最初の出力分岐の末尾に分類出力層が追加されます。

すべて折りたたむ

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)

事前学習済みの ONNX ネットワークを LayerGraph オブジェクトとしてインポートします。次に、インポートした層を組み立てて DAGNetwork オブジェクトを作成し、組み立てたネットワークを使用してイメージを分類します。

squeezenet畳み込みニューラル ネットワークの ONNX モデルを生成します。

squeezeNet = squeezenet;
exportONNXNetwork(squeezeNet,"squeezeNet.onnx");

モデル ファイルとクラス名を指定します。

modelfile = "squeezenet.onnx";
ClassNames = squeezeNet.Layers(end).Classes;

ONNX ネットワークの層と重みをインポートします。既定では、importONNXLayersDAGNetwork オブジェクトと互換性のある 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)

squeezenetLgraphAnalyze.png

インポートしたネットワークの最後の層を表示します。出力を見ると、この層グラフのネットワーク アーキテクチャの末尾に 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 

事前学習済みの 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 長短期記憶 (LSTM) ネットワークを層グラフとしてインポートし、プレースホルダー層を検索して置換します。LSTM ネットワークでは、シーケンス データをネットワークに入力し、シーケンス データの個々のタイム ステップに基づいて予測を行うことができます。

lstmNet は、深層学習を使用したシーケンスの分類で作成した LSTM ネットワークと同様のアーキテクチャとなっています。lstmNet は、続けて発音された 2 つの日本語の母音を表す時系列データに対してその話者を認識するように学習が行われています。

lstmNet をモデル ファイルとして指定します。

modelfile = "lstmNet.onnx";

ONNX ネットワークの層と重みをインポートします。既定では、importONNXLayersDAGNetwork オブジェクトと互換性のある 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 は、警告を表示して出力層のプレースホルダー層を挿入します。

プレースホルダー層を確認するには、lgraphLayers プロパティを表示するか、関数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 モデル ファイルの名前。文字ベクトルまたは string スカラーとして指定します。ファイルは、現在のフォルダーまたは MATLAB パス上のフォルダーに含まれていなければならず、そうでなければこのファイルの絶対パスまたは相対パスを含めなければなりません。

例: "cifarResNet.onnx"

名前と値の引数

すべて折りたたむ

オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。

例: importONNXLayers(modelfile,TargetNetwork="dagnetwork",GenerateCustomLayers=true,Namespace="CustomLayers") は、modelfile 内のネットワーク層を DAGNetwork オブジェクトと互換性のある層グラフとしてインポートし、自動生成したカスタム層を現在のフォルダー内の名前空間 +CustomLayers に保存します。

カスタム層の生成オプション。数値または logical 1 (true) または logical 0 (false) として指定します。GenerateCustomLayerstrue に設定した場合、ソフトウェアが ONNX 演算子をそれと等価な組み込みの MATLAB 層に変換できないときに、importONNXLayers がカスタム層の生成を試みます。importONNXLayers は、生成した各カスタム層を、+Namespace で個別の .m ファイルとして保存します。カスタム層を表示または編集するには、関連する .m ファイルを開きます。カスタム層の詳細については、カスタム層を参照してください。

例: GenerateCustomLayers=false

importONNXLayers がカスタム層を保存するカスタム層名前空間の名前。文字ベクトルまたは string スカラーとして指定します。importONNXLayers は、カスタム層の名前空間 +Namespace を現在のフォルダーに保存します。Namespace を指定しない場合、importONNXLayers は、カスタム層を現在のフォルダー内の +modelfile という名前の名前空間に保存します。名前空間の詳細については、名前空間の作成を参照してください。

例: Namespace="shufflenet_9"

例: Namespace="CustomLayers"

インポートしたネットワーク アーキテクチャの Deep Learning Toolbox ネットワークのターゲット タイプ。"dagnetwork" または "dlnetwork" として指定します。関数 importONNXLayers は、DAGNetwork オブジェクトまたは dlnetwork オブジェクトと互換性のある LayerGraph オブジェクトとしてネットワーク アーキテクチャをインポートします。

  • TargetNetwork"dagnetwork" として指定した場合、インポートされる lgraph には、ONNX モデルで指定されるか、名前と値の引数 InputDataFormatsOutputDataFormats または OutputLayerType で指定した入力層と出力層を含めなければなりません。

  • TargetNetwork"dlnetwork" として指定した場合、importONNXLayers によって lgraph の各出力分岐の末尾に CustomOutputLayer が追加され、場合によっては入力分岐の先頭に CustomInputLayer が追加されます。入力のデータ形式または入力のイメージ サイズが不明の場合は、この関数により CustomInputLayer が追加されます。これらの層のデータ形式に関するネットワーク固有の情報については、CustomInputLayer オブジェクトおよび CustomOutputLayer オブジェクトのプロパティを参照してください。Deep Learning Toolbox の入出力データ形式を解釈する方法の詳細については、ONNX 入出力テンソルから組み込みの MATLAB 層への変換を参照してください。

例: TargetNetwork="dlnetwork" は、dlnetwork オブジェクトと互換性のある LayerGraph オブジェクトをインポートします。

ネットワーク入力のデータ形式。文字ベクトル、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

ネットワーク出力のデータ形式。文字ベクトル、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

最初のネットワーク入力の入力イメージのサイズ。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 次元カラー入力イメージの場合)

最初のネットワーク出力の層のタイプ。"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"

定数畳み込みによる最適化。"deep""shallow" または "none" として指定します。定数畳み込みは、ONNX 演算子からそれと等価な組み込みの MATLAB 層への変換の際に、ONNX 初期化子 (初期定数値) に対して演算を実行することで、インポートされたネットワーク アーキテクチャを最適化します。

ソフトウェアによって等価な組み込みの MATLAB 層に変換できない演算子が ONNX ネットワークに含まれている場合 (組み込みの MATLAB 層への変換がサポートされている ONNX 演算子を参照)、importONNXLayers は、サポートされない各層の代わりにプレースホルダー層を挿入します。詳細については、ヒントを参照してください。

定数畳み込みによる最適化を行うことで、プレースホルダー層の数を減らすことができます。FoldConstants"deep" に設定した場合、インポートした層に含まれるプレースホルダー層の数は、この引数を "shallow" に設定した場合と同じか、それより少なくなります。ただし、インポートする時間が長くなる可能性があります。ネットワーク アーキテクチャの最適化を無効にするには、FoldConstants"none" に設定します。

例: FoldConstants="shallow"

出力引数

すべて折りたたむ

事前学習済みの ONNX モデルのネットワーク アーキテクチャ。LayerGraph オブジェクトとして返されます。

インポートした層グラフを予測に使用するには、LayerGraph オブジェクトを DAGNetwork オブジェクトまたは dlnetwork オブジェクトに変換しなければなりません。目的のワークフローに応じて、名前と値の引数 TargetNetwork"dagnetwork" または "dlnetwork" として指定します。

  • assembleNetwork を使用して、LayerGraphDAGNetwork に変換します。その後、DAGNetwork オブジェクト上で、関数 classify を使用してクラス ラベルを予測します。

  • dlnetwork を使用して、LayerGraphdlnetwork に変換します。その後、dlnetwork オブジェクト上で、関数 predict を使用してクラス ラベルを予測します。正しいデータ形式を使用して、入力データを dlarray として指定します (詳細については、dlarray の引数 fmt を参照してください)。

制限

  • importONNXLayers は以下をサポートします。

    • ONNX 中間表現 version 9

    • ONNX 演算子セット 6 ~ 20

メモ

エクスポートしたネットワークをインポートする場合、元のネットワークの層とは異なるネットワークの層が再インポートされ、サポート対象外となる可能性があります。

詳細

すべて折りたたむ

ヒント

  • インポートしたネットワークに、組み込みの MATLAB 層への変換がサポートされていない ONNX 演算子が含まれており (組み込みの MATLAB 層への変換がサポートされている ONNX 演算子を参照)、importONNXLayers がカスタム層を生成しない場合、importONNXLayers はサポートされない層の代わりにプレースホルダー層を挿入します。ネットワークに含まれるサポート対象外の層の名前とインデックスを見つけるには、関数 findPlaceholderLayers を使用します。その後、プレースホルダー層を、ユーザーが定義した新しい層に置き換えることができます。層を置き換えるには、replaceLayer を使用します。

  • 事前学習済みのネットワークを新しいイメージの予測または転移学習に使用するには、インポートしたモデルの学習に使用したイメージと同じようにイメージを前処理しなければなりません。最も一般的な前処理ステップは、イメージのサイズ変更、イメージの平均値の減算、イメージの BGR 形式から RGB 形式への変換です。

    • イメージのサイズを変更するには、imresize を使用します。たとえば、imresize(image,[227 227 3]) のようにします。

    • RGB 形式から BGR 形式にイメージを変換するには、flip を使用します。たとえば、flip(image,3) のようにします。

    学習および予測用のイメージの前処理の詳細については、イメージの深層学習向け前処理を参照してください。

  • 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 ネットワークをインポートするための 4 つの関数 (importONNXNetworkimportONNXLayersimportONNXFunction、および importNetworkFromONNX) が用意されています。

参照

[1] Open Neural Network Exchange. https://github.com/onnx/.

[2] ONNX. https://onnx.ai/.

バージョン履歴

R2018a で導入

すべて展開する