メインコンテンツ

importNetworkFromONNX

MATLAB ネットワークとしての ONNX ネットワークのインポート

R2023b 以降

    説明

    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 名前空間に保存します。

    net = importNetworkFromONNX(modelfile,Name=Value) は、1 つ以上の名前と値の引数で指定された追加オプションを使用して、事前学習済みの ONNX ネットワークをインポートします。たとえば、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)

    Figure contains an axes object. The hidden axes object contains an object of type image.

    イメージを 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 の場合、importNetworkFromONNXNamespace で示されるカスタム層名前空間内に +coder 名前空間を生成します。+coder 名前空間には、汎用 C/C++ コード生成に使用される MATLAB Coder™ 互換のカスタム層と演算子が含まれています。コード生成を行わない場合は、ONNX ネットワークのインポートを高速化するために、GenerateCoderFiles=false を指定してコーダー ファイルの生成を無効にします。

    自動生成されたカスタム層としてインポートされた層がネットワークにない場合、コーダー ファイルは生成されません。

    コード生成の詳細については、深層学習ネットワーク向けの汎用 C/C++ コードの生成 (MATLAB Coder)を参照してください。

    例: GenerateCoderFiles=false

    データ型: logical

    出力引数

    すべて折りたたむ

    事前学習済みの ONNX ネットワーク。dlnetwork オブジェクトとして返されます。場合によっては、ソフトウェアがデータ形式やサイズを入力できなかったり、ONNX 演算子をプレースホルダー関数としてインポートできなかったりして、ネットワークが初期化されないことがあります。その場合は、initialize 関数を使用してネットワークを初期化しなければなりません。このネットワークで predict 関数を使用することで、クラス ラベルを予測できます。正しいデータ形式を使用して、入力データを dlarray オブジェクトとして指定します。詳細については、dlarrayfmt 引数を参照してください。

    制限

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

      • ONNX 中間表現 version 9

      • ONNX 演算子セット 6 ~ 20

    メモ

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

    詳細

    すべて折りたたむ

    ヒント

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

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

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

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

    • +Namespace 名前空間の親フォルダーが MATLAB パス上にない場合、その名前空間のメンバー (カスタムの層および演算子) にアクセスすることはできません。詳細については、名前空間と MATLAB パスを参照してください。

    • 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 にインポートします。

    1. 関数は、ONNX 演算子を組み込みの MATLAB 層としてインポートすることを試みます。詳細については、組み込みの MATLAB 層への変換がサポートされている ONNX 演算子を参照してください。

    2. 関数は、ONNX 演算子をカスタム層としてインポートすることを試みます。importNetworkFromONNX は、生成されたカスタム層および関連する関数を +Namespace 名前空間に保存します。例については、自動生成されたカスタム層をもつ ONNX ネットワークのインポートを参照してください。

    3. 関数は、プレースホルダー関数を含むカスタム層として 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 で導入

    すべて展開する