メインコンテンツ

importNetworkFromPyTorch

R2026b

PyTorch ネットワークを MATLAB ネットワークとしてインポートする

R2022b 以降

    説明

    Add-On Required: この機能には Deep Learning Toolbox Converter for PyTorch Models アドオンが必要です。

    net = importNetworkFromPyTorch(modelfile) は、事前学習済みの PyTorch® モデルをファイル modelfile からインポートします。PyTorch モデルは、エクスポートされたプログラムまたはトレースされたモデルでなければなりません。エクスポートされたプログラム モデルは、より多くの Deep Learning Toolbox™ の組み込み層をもつモデルであるため、推奨されます。

    モデルをインポート用に準備するために、PyTorch version 2.8 を使用してモデルをエクスポートすることを試みてください。モデルをエクスポートできない場合は、トレースします。詳細については、ヒントを参照してください。次のコードは、PyTorch モデルをインポート用に準備するために必要な手順の概要を示します。

    # Ensure the layers are set to inference mode.
    model.eval()
    # Move the model to the CPU.
    model.to("cpu")
    # Generate input data.
    X = torch.rand(1,3,224,224)
    
    # For ExportedProgram models 
    # Export the model and save it in PyTorch version 2.8.
    exported_model = torch.export.export(model, (X,))
    torch.export.save(exported_model, 'myModel.pt2')
    
    # For traced models
    # Trace the model and save it.
    traced_model = torch.jit.trace(model.forward, X)
    traced_model.save('myModel.pt')

    ヒント

    ディープ ネットワーク デザイナーを使用して PyTorch モデルを対話形式でインポートします。インポート時に、アプリは注意が必要な問題の詳細を含むインポート レポートを表示します。詳細については、外部のプラットフォームからのネットワークのインポートを参照してください。

    例

    net = importNetworkFromPyTorch(modelfile,Name=Value) は、1 つ以上の名前と値の引数で指定された追加オプションを使用して、事前学習済みの PyTorch ネットワークをインポートします。たとえば、Namespace="CustomLayers" は、生成されたカスタム層と関連する関数を現在のフォルダーの +CustomLayers 名前空間に保存します。

    ヒント

    トレースされたモデルの場合、名前と値の引数 PyTorchInputSizes が指定されていると、この関数はより多くの Deep Learning Toolbox の組み込み層を返すことがあります。

    例

    例

    すべて折りたたむ

    CIFAR-10 [1] データで学習させた PyTorch モデルをインポートします。このモデルは、以下の Python コードを使用し、PyTorch version 2.8 において、エクスポートされたプログラムというモデル形式で保存されました。

    X = torch.rand(1,3,32,32)
    exported_model = torch.export.export(model, (X,))
    torch.export.save(exported_model, "exported_pytorch_model.pt2")  
    

    詳細については、学習済みの PyTorch モデルのエクスポートと保存を参照してください。

    modelfile = "exported_pytorch_model.pt2";
    net = importNetworkFromPyTorch(modelfile)
    Importing the model, this may take a few minutes...
    
    net = 
      dlnetwork with properties:
    
             Layers: [9×1 nnet.cnn.layer.Layer]
        Connections: [11×2 table]
         Learnables: [86×3 table]
              State: [42×3 table]
         InputNames: {'InputLayer1'}
        OutputNames: {'ResidualNetSmall:fc'}
        Initialized: 1
    
      View summary with summary.
    
    

    インポート後にネットワークを変更する場合、ResidualNetSmall:fc 層への入力は PyTorch ネットワークと同じ順序である必要があります。たとえば、元の PyTorch ネットワークの線形層への入力が 1 行 64 列だった場合、ResidualNetSmall:fc 層への入力も 1 行 64 列である必要があります。

    次に、インポートされたネットワーク層を分析します。

    analyzeNetwork(net)

    インポートされたネットワークは、組み込みの MATLAB 層とカスタム層で構成されています。

    [1] Krizhevsky, Alex. "Learning multiple layers of features from tiny images." (2009). https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

    CIFAR-10 [1] データ セットで学習させた PyTorch モデルをインポートします。このモデルは、PyTorch version 2.8 において、エクスポートされたプログラムというモデル形式で保存されました。

    詳細については、学習済みの PyTorch モデルのエクスポートと保存を参照してください。

    modelfile = "exported_pytorch_model.pt2";
    net = importNetworkFromPyTorch(modelfile)
    Importing the model, this may take a few minutes...
    
    net = 
      dlnetwork with properties:
    
             Layers: [9×1 nnet.cnn.layer.Layer]
        Connections: [11×2 table]
         Learnables: [86×3 table]
              State: [42×3 table]
         InputNames: {'InputLayer1'}
        OutputNames: {'ResidualNetSmall:fc'}
        Initialized: 1
    
      View summary with summary.
    
    

    この関数は、dlnetwork オブジェクトとしてモデルをインポートします。

    CIFAR-10 データ セットをダウンロードします。このデータ セットには 60,000 個のイメージが格納されています。各イメージのサイズは 32×32 ピクセルで 3 つのカラー チャネル (RGB) があります。データ セットのサイズは 175 MB です。インターネット接続の速度によっては、ダウンロード プロセスに時間がかかることがあります。

    datadir = tempdir; 
    downloadCIFARData(datadir);

    CIFAR-10 テスト イメージを 4 次元配列として読み込みます。テスト セットには 10,000 個のイメージが格納されています。CIFAR-10 テスト イメージをネットワークの検証用に使用します。

    [~,~,XValidation,TValidation] = loadCIFARData(datadir);

    テスト データから抽出したイメージとラベルを表示します。

    idx=1;
    Im = XValidation(:,:,:,idx);
    imshow(Im)
    title("Label: "+string(TValidation(idx)))

    イメージをdlarrayオブジェクトに変換します。"SSCB" (空間、空間、チャネル、バッチ) の次元でイメージの形式を整えます。

    Im_dlarray = dlarray(single(Im),"SSCB");

    イメージを分類し、予測されたラベルを見つけます。

    prob = predict(net,Im_dlarray);
    predLabel = scores2label(prob,categories(TValidation));
    disp("The predicted label is "+string(predLabel))
    The predicted label is cat
    

    [1] Krizhevsky, Alex. "Learning multiple layers of features from tiny images." (2009). https://www.cs.toronto.edu/~kriz/learning-features-2009-TR.pdf

    名前と値の引数 PyTorchInputSizes を使用して、事前学習済みかつトレース済みの PyTorch モデルを初期化された dlnetwork オブジェクトとしてインポートします。詳細な手順については、学習済みの PyTorch モデルのトレースと保存を参照してください。

    この例では、MNASNet (Copyright© Soumith Chintala 2016) PyTorch モデルをインポートします。MNASNet は、ImageNet データベースのイメージを使って学習させるイメージ分類モデルです。MathWorks の Web サイトから、mnasnet1_0.pt ファイルをダウンロードします。ファイルのサイズは約 17 MB です。

    modelfile = matlab.internal.examples.downloadSupportFile("nnet", ...
        "data/PyTorchModels/mnasnet1_0.pt");

    名前と値の引数 PyTorchInputSizes が指定された importNetworkFromPyTorch 関数を使用して、MNASNet モデルをインポートします。224x224 のカラー イメージがこの PyTorch モデルの有効な入力サイズであることがわかっています。ソフトウェアは、イメージのバッチに対して入力層を自動的に作成して追加します。これにより、1 行のコードでネットワークを初期化されたネットワークとしてインポートすることができます。

    net = importNetworkFromPyTorch(modelfile,PyTorchInputSizes=[NaN,3,224,224])
    Importing the model, this may take a few minutes...
    
    net = 
      dlnetwork with properties:
    
             Layers: [4×1 nnet.cnn.layer.Layer]
        Connections: [3×2 table]
         Learnables: [210×3 table]
              State: [104×3 table]
         InputNames: {'InputLayer1'}
        OutputNames: {'MNASNet:classifier'}
        Initialized: 1
    
      View summary with summary.
    
    

    ネットワークは予測に使用する準備ができています。

    入力引数

    すべて折りたたむ

    PyTorch モデル ファイルの名前。文字ベクトルまたは string スカラーとして指定します。modelfile は現在のフォルダー内にあるか、ファイルへの絶対パスまたは相対パスが含まれていなければなりません。PyTorch モデルは事前学習されていなければならず、かつ次のいずれかである必要があります。

    例: "mobilenet_v3.pt"

    名前と値の引数

    すべて折りたたむ

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

    例: importNetworkFromPyTorch(modelfile,Namespace="CustomLayers") は、modelfile 内のネットワークをインポートし、カスタム層の名前空間 +Namespace を現在のフォルダーに保存します。

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

    カスタムの PyTorch 層をインポートしたとき、またはソフトウェアが PyTorch 層をそれと等価な組み込みの MATLAB® 層に変換できないとき、importNetworkFromPyTorch はカスタム層の生成を試みます。importNetworkFromPyTorch は、生成した各カスタム層を、+Namespace で個別の MATLAB コード ファイルとして保存します。カスタム層を表示または編集するには、関連する MATLAB コード ファイルを開きます。カスタム層の詳細については、カスタム層を参照してください。

    +Namespace 名前空間には、+ops 内部名前空間を含めることもできます。この内部名前空間には、自動生成されたカスタム層が使用する PyTorch 演算子に対応する MATLAB 関数が格納されます。importNetworkFromPyTorch は、各演算子に関連する MATLAB 関数を +ops 内部名前空間の個別の MATLAB コード ファイルに保存します。dlnetwork のオブジェクト関数 (predict 関数など) は、カスタム層とやり取りするときにこれらの演算子を使用します。+ops 内部名前空間にはプレースホルダー関数を含めることもできます。詳細については、プレースホルダー関数を参照してください。

    例: Namespace="mobilenet_v3"

    PyTorch ネットワーク入力の次元サイズ。数値配列、string スカラー、または cell 配列として指定します。次元の入力順序は PyTorch ネットワークと同じです。ネットワークへの入力が単一の非スカラー入力である場合にのみ、PyTorchInputSizes を数値配列として指定できます。ネットワークに複数の入力がある場合、PyTorchInputSizes は入力サイズの cell 配列でなければなりません。入力のサイズまたは形状が不明な場合、PyTorchInputSize を "unknown" として指定します。入力が PyTorch の 0 次元スカラーに対応する場合、PyTorchInputSize を "scalar" として指定します。

    importNetworkFromPyTorch がサポートする標準入力層は、ImageInputLayer (SSCB)、FeatureInputLayer (CB)、ImageInputLayer3D (SSSCB)、および SequenceInputLayer (CBT) です。ここで、S は空間、C はチャネル、B はバッチ、T は時間です。importNetworkFromPyTorch は、PyTorchInputSizes を使用した非標準の入力もサポートします。たとえば、関数呼び出し net = importNetworkFromPyTorch("nonStandardModel.pt",PyTorchInputSizes=[1 3 224]) を使用し、ネットワークをインポートして入力次元のサイズを指定します。次に、関数呼び出し X = dlarray(rand(1 3 224),"UUU") および net = initialize(net,X) を使用し、U のラベル (U は不明を表す) が付けられた dlarray オブジェクトを使ってネットワークを初期化します。ソフトウェアは、U のラベルが付けられた dlarray を PyTorch の順序に従うデータとして解釈します。

    例: PyTorchInputSizes=[NaN 3 224 224] は、イメージのバッチである 1 つの入力をもつネットワークです。

    例: PyTorchInputSizes={[NaN 3 224 224],"unknown"} は、2 つの入力をもつネットワークです。最初の入力はイメージのバッチであり、2 番目の入力のサイズは不明です。

    データ型: numeric array | string | cell array

    ネットワーク構成の表現。次のいずれかの値として指定します。

    • "networklayer" — networkLayer 層オブジェクトを使用して、インポートされたネットワーク内のネットワーク構成を表現します。この値を指定すると、ソフトウェアは、カスタム層の数が増えないという制約の下で可能な限り多くの PyTorch 関数を Deep Learning Toolbox 層に変換します。

    • "customlayer" — 入れ子のカスタム層を使用して、インポートされたネットワーク内のネットワーク構成を表現します。この値を指定すると、importNetworkFromPyTorch は、一連の PyTorch 関数を Deep Learning Toolbox 関数に変換してから、それらをカスタム層に統合します。カスタム層の詳細については、カスタム深層学習層の定義を参照してください。

    例: PreferredNestingType="customlayer"

    データ型: char | string

    R2026b 以降

    自動生成されたカスタム層のコーダー ファイルを生成するフラグ。数値または logical の 1(true) または 0(false) として指定します。値が true の場合、importNetworkFromPyTorch は Namespace で示されるカスタム層名前空間内に +coder 名前空間を生成します。+coder 名前空間には、汎用 C/C++ コード生成に使用される MATLAB Coder™ 互換のカスタム層と演算子用のファイルが含まれています。生成された名前空間ファイルには、スタブ実装が組み込まれたプレースホルダー関数があります。カスタム層の Namespace ファイルと +coder 名前空間ファイルの両方において、完全な実装を提供しなければなりません。コード生成を行わない場合は、PyTorch ネットワークのインポートを高速化するために、値を false に指定してコーダー ファイルの生成を無効にしてください。

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

    インポートした dlnetwork に networkLayer オブジェクトが含まれている場合、コード生成のために MAT ファイルに保存する前に、dlnetwork に対して expandLayers を呼び出す必要があります。

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

    例: GenerateCoderFiles=false

    データ型: logical

    R2026b 以降

    入力データ形式。文字ベクトル、string スカラー、または string 配列として指定します。インポーターは、MATLAB と PyTorch との間でデータの順列を解釈するために形式を使用します。importNetworkFromPyTorch がモデルから入力データ形式を判別できない場合、この名前と値の引数を使用します。

    空のデータ形式 ("") を指定した場合、importNetworkFromPyTorch は入力データ形式を自動的に解釈します。

    値は、表に記載されている書式文字列のいずれか、または空文字列 ("") でなければなりません。

    形式タイプPyTorchMATLAB順列
    2 次元イメージBCSS / CSSSSCB / SSC[3 4 2 1] / [2 3 1]
    3 次元イメージBCSSS / CSSSSSSCB / SSSC[3 4 5 2 1] / [2 3 4 1]
    シーケンスBCT / TBC / BTC / TC / CTCBT / CT[2 1 3] / [3 2 1] / [3 1 2] / [1 2] / [2 1]
    特徴BCCB[2 1]

    指定されたデータ形式が、モデル内の演算から伝播される形式情報と競合する場合、関数はエラーを返します。

    例: PyTorchInputDataFormats="BCSS"

    例: PyTorchInputDataFormats=["BCSS","","BC"]

    データ型: char | string

    R2026b 以降

    出力データ形式。文字ベクトル、string スカラー、または string 配列として指定します。インポーターは、MATLAB と PyTorch との間でデータの順列を解釈するために形式を使用します。importNetworkFromPyTorch がモデルから出力データ形式を判別できない場合、この名前と値の引数を使用します。

    空のデータ形式 ("") を指定した場合、importNetworkFromPyTorch は出力データ形式を自動的に解釈します。

    値は、表に記載されている書式文字列のいずれか、または空文字列 ("") でなければなりません。

    形式タイプPyTorchMATLAB順列
    2 次元イメージBCSS / CSSSSCB / SSC[3 4 2 1] / [2 3 1]
    3 次元イメージBCSSS / CSSSSSSCB / SSSC[3 4 5 2 1] / [2 3 4 1]
    シーケンスBCT / TBC / BTC / TC / CTCBT / CT[2 1 3] / [3 2 1] / [3 1 2] / [1 2] / [2 1]
    特徴BCCB[2 1]

    指定されたデータ形式が、モデル内の演算から伝播される形式情報と競合する場合、関数はエラーを返します。

    例: PyTorchOutputDataFormats="BC"

    例: PyTorchOutputDataFormats=["BCSS","","BC"]

    データ型: char | string

    出力引数

    すべて折りたたむ

    事前学習済みの PyTorch ネットワーク。dlnetwork オブジェクトとして返されます。

    制限

    • importNetworkFromPyTorch 関数は、PyTorch version 2.8 で作成されたエクスポート済みネットワークをサポートします。この関数は、他のバージョンの PyTorch で作成されたトレース済みネットワークをサポートできる場合があります。

    • 動的な形状でエクスポートされた ExportedProgram 形式のモデルのインポートはサポートされていません。

    • コード生成では、インポートしたネットワークに networkLayer オブジェクトが含まれている場合、コード生成のために保存する前に、expandLayers を使用してネットワークを展開しなければなりません。

    詳細

    すべて折りたたむ

    ヒント

    • PyTorch モデルをインポート用に準備するには、トレースではなく torch.export.export() を使用したエクスポートが推奨されます。ExportedProgram 形式は、モデルの計算グラフ、入力と出力の仕様、パラメーターを決定論的な構造で取り込む、フレームワーク非依存の安定したファイルを提供します。この形式により、ソフトウェアは、初期化され、より多くの MATLAB の組み込み層で構成されたモデルをインポートできます。

    • トレースされたモデルをインポートする際に、PyTorch の層を MATLAB の組み込み層としてより適切にインポートできるようにするには、PyTorchInputSizes を指定します。

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

    • Python ライブラリの競合が発生した場合は、pyenv 関数を使用して、名前と値の引数 ExecutionMode を "OutOfProcess" として指定します。

    • その他のヒントについては、TensorFlow、PyTorch、および ONNX からモデルをインポートする際のヒントを参照してください。

    アルゴリズム

    importNetworkFromPyTorch 関数は、次の手順を順番に試し、PyTorch 層を MATLAB にインポートします。

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

    2. 関数は、PyTorch 層を組み込みの MATLAB 関数としてインポートすることを試みます。詳細については、PyTorch 層の変換を参照してください。

    3. 関数は、PyTorch 層をカスタム層としてインポートすることを試みます。importNetworkFromPyTorch は、生成されたカスタム層および関連する関数を +Namespace 名前空間に保存します。

    4. 関数は、プレースホルダー関数を含むカスタム層として PyTorch 層をインポートします。プレースホルダー関数は、ネットワークを使用する前に補完しなければなりません。プレースホルダー関数を参照してください。

    最初の 3 つのケースでは、インポートされたネットワークは初期化後に予測の準備が整います。

    代替機能

    アプリ

    ディープ ネットワーク デザイナーアプリを使用して、外部プラットフォームからネットワークをインポートすることもできます。アプリは importNetworkFromPyTorch 関数を使用してネットワークをインポートし、進行状況ダイアログ ボックスを表示します。インポート プロセス中に、アプリはネットワークに入力層を追加し (可能な場合)、注意が必要な問題の詳細を含むインポート レポートを表示します。ネットワークをインポートした後、ネットワークを対話的に編集、可視化、および解析できます。ネットワークの編集が完了したら、それを Simulink® にエクスポートするか、ネットワークを構築するための MATLAB コードを生成できます。

    ブロック

    PyTorch Model Predict ブロックを使用して PyTorch ネットワークを扱うこともできます。このブロックを使用すると、Python 関数を読み込んでデータを前処理および後処理したり、入力端子と出力端子を対話的に構成したりすることもできます。

    バージョン履歴

    R2022b で導入

    すべて展開する