メインコンテンツ

importNetworkFromTensorFlow

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

R2023b 以降

    説明

    net = importNetworkFromTensorFlow(modelFolder) は、SavedModel 形式のネットワークが格納されているフォルダー modelFolder から事前学習済みの TensorFlow™ ネットワークをインポートします。ネットワークは、.pb の拡張子をもつ saved_model ファイルで定義された層と、variables サブフォルダー内の学習済みの重みで構成されます。この関数は、ネットワーク net を初期化された dlnetwork オブジェクトとして返します。

    importNetworkFromTensorFlow を使用するには、Deep Learning Toolbox™ Converter for TensorFlow Models サポート パッケージが必要です。このサポート パッケージがインストールされていない場合、importNetworkFromTensorFlow によってダウンロード用リンクが表示されます。

    メモ

    importNetworkFromTensorFlow 関数は、TensorFlow 層をインポートするときにカスタム層を生成できます。詳細については、アルゴリズムを参照してください。関数は、生成されたカスタム層を +modelFolder 名前空間に保存します。

    net = importNetworkFromTensorFlow(modelFolder,Name=Value) は、1 つ以上の名前と値の引数を使用して追加のオプションを指定します。たとえば、生成されたカスタム層と関連する関数を保存する名前空間を指定できます。

    すべて折りたたむ

    SavedModel 形式の事前学習済み TensorFlow ネットワークをインポートし、インポートしたネットワークを使用してクラス ラベルを予測します。

    モデル フォルダーを指定します。

    if ~exist('digitsdlnetwork','dir')
        unzip('digitsdlnetwork.zip')
    end
    modelFolder = './digitsdlnetwork';

    クラス名を指定します。

    classNames = {'0','1','2','3','4','5','6','7','8','9'};

    初期化された dlnetwork オブジェクトとして、SavedModel 形式の TensorFlow ネットワークをインポートします。

    net = importNetworkFromTensorFlow(modelFolder)
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation. Assembling network...
    Import finished.
    
    net = 
      dlnetwork with properties:
    
             Layers: [12×1 nnet.cnn.layer.Layer]
        Connections: [12×2 table]
         Learnables: [6×3 table]
              State: [0×3 table]
         InputNames: {'input_1'}
        OutputNames: {'activation_1'}
        Initialized: 1
    
      View summary with summary.
    
    

    分類するイメージを読み取り、そのイメージのサイズを表示します。このイメージは、サイズが 28×28 ピクセルであるグレースケール (1 チャネル) のイメージです。

    digitDatasetPath = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset');
    I = imread(fullfile(digitDatasetPath,'5','image4009.png'));
    size(I)
    ans = 1×2
    
        28    28
    
    

    ネットワークの入力サイズを表示します。今回の場合、イメージ サイズはネットワークの入力サイズと一致しています。サイズが一致しない場合は、コマンド imresize(I,netInputSize(1:2)) を使用してイメージのサイズを変更しなければなりません。

    netInputSize = net.Layers(1).InputSize
    netInputSize = 1×3
    
        28    28     1
    
    

    イメージを dlarray オブジェクトに変換します。イメージを次元 'SSCB' (spatial、spatial、channel、batch) で形式を整えます。この場合、バッチ サイズは 1 であるため、バッチ サイズを省略できます ('SSC')。

    I_dlarray = dlarray(single(I),'SSC');

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

    prob = predict(net,I_dlarray);
    [~,label] = max(prob);

    イメージと分類結果を表示します。

    imshow(I)
    title(['Classification result ' classNames{label}]) 

    Figure contains an axes object. The hidden axes object with title Classification result 5 contains an object of type image.

    SavedModel 形式の事前学習済み TensorFlow ネットワークをインポートします。ネットワークには、ソフトウェアによって組み込みの MATLAB 層に変換できない層が含まれています。このネットワークをインポートすると、ソフトウェアによって自動的にカスタム層が生成されます。

    この例では、findCustomLayers 補助関数を使用します。この関数のコードを見るには、補助関数を参照してください。

    モデル フォルダーを指定します。

    if ~exist('digitsdlnetworkwithnoise','dir')
        unzip('digitsdlnetworkwithnoise.zip')
    end
    modelFolder = './digitsdlnetworkwithnoise';

    SavedModel 形式の TensorFlow ネットワークをインポートします。

    net = importNetworkFromTensorFlow(modelFolder)
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation. Assembling network...
    Import finished.
    
    net = 
      dlnetwork with properties:
    
             Layers: [14×1 nnet.cnn.layer.Layer]
        Connections: [14×2 table]
         Learnables: [6×3 table]
              State: [0×3 table]
         InputNames: {'input_1'}
        OutputNames: {'activation_1'}
        Initialized: 1
    
      View summary with summary.
    
    

    インポートしたネットワークには、ソフトウェアによって組み込みの MATLAB 層に変換できない層が含まれているため、importNetworkFromTensorFlow はこれらの層の代わりにカスタム層を自動的に生成します。この関数は、生成された各カスタム層を、現在のフォルダーの +digitsdlnetworkwithnoise 名前空間内の個別の M ファイルに保存します。

    補助関数 findCustomLayers を使用して、自動生成されたカスタム層のインデックスを見つけ、このカスタム層を表示します。

    ind = findCustomLayers(net.Layers,'+digitsdlnetworkwithnoise');
    net.Layers(ind)
    ans = 
      3×1 Layer array with layers:
    
         1   'concatenate_1'      Concatenate     digitsdlnetworkwithnoise.kConcatenate1Layer3826
         2   'gaussian_noise_1'   GaussianNoise   digitsdlnetworkwithnoise.kGaussianNoise1Layer3766
         3   'gaussian_noise_2'   GaussianNoise   digitsdlnetworkwithnoise.kGaussianNoise2Layer3791
    

    ネットワーク アーキテクチャをプロットします。

    plot(net)
    title('Network Architecture')

    補助関数

    このセクションでは、findCustomLayers 補助関数を定義します。findCustomLayers は、importNetworkFromTensorFlow によって自動的に生成されるカスタム層のインデックスを返します。

    function indices = findCustomLayers(layers,Namespace)
    
    s = what(['.' filesep 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

    SavedModel 形式の事前学習済み TensorFlow ネットワークをインポートします。これは、初期化されていないネットワークになります。次に、ネットワークを初期化します。

    モデル フォルダーを指定します。

    if ~exist("noInputLayerTFModel","dir")
        unzip("noInputLayerTFModel.zip")
    end
    modelFolder = "./noInputLayerTFModel";

    importNetworkFromTensorFlow 関数を使用してモデルをインポートします。このモデルには固定の入力サイズがないため、関数は入力層のない未初期化の dlnetwork オブジェクトとしてモデルをインポートします。ソフトウェアによって、ネットワークを初期化する方法を説明する警告が表示されます。

    net = importNetworkFromTensorFlow(modelFolder)
    Importing the saved model...
    Translating the model, this may take a few minutes...
    
    Warning: Size of the input to "input_5d" is unknown in TensorFlow.
    
    Finished translation. Assembling network...
    
    Warning: Network is imported as an uninitialized dlnetwork object. Before using the network, add input layer(s):
    
    inputLayer1 = sequenceInputLayer(<inputSize1>, Normalization="none");
    net = addInputLayer(net, inputLayer1, Initialize=true);
    
    For more information on which format(s) to use, see documentation for dlarray.
    
    Import finished.
    
    net = 
      dlnetwork with properties:
    
             Layers: [5×1 nnet.cnn.layer.Layer]
        Connections: [4×2 table]
         Learnables: [4×3 table]
              State: [0×3 table]
         InputNames: {'conv2d_20'}
        OutputNames: {'dense_12_softmax'}
        Initialized: 0
    
      View summary with summary.
    
    

    インポートしたネットワークの入力サイズを指定して、シーケンス入力層を作成します。次に、インポートしたネットワークにシーケンス入力層を追加し、addInputLayer 関数を使用してネットワークを初期化します。

    inputLayer1 = sequenceInputLayer([28 28 3], Normalization="none");
    net = addInputLayer(net,inputLayer1,Initialize=true)
    net = 
      dlnetwork with properties:
    
             Layers: [6×1 nnet.cnn.layer.Layer]
        Connections: [5×2 table]
         Learnables: [4×3 table]
              State: [0×3 table]
         InputNames: {'sequenceinput'}
        OutputNames: {'dense_12_softmax'}
        Initialized: 1
    
      View summary with summary.
    
    

    ネットワークには入力層が含まれており、予測に使用する準備が整っています。ディープ ネットワーク デザイナーアプリを使用して、ネットワークをさらに解析できます。

    deepNetworkDesigner(net)
    

    初期化された dlnetwork オブジェクトとして、SavedModel 形式の TensorFlow ネットワークをインポートします。analyzeNetwork関数を使用してネットワークを解析します。

    net = importNetworkFromTensorFlow("CustomConvReluBN");
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation. Assembling network...
    Import finished.
    
    analyzeNetwork(net)

    default.png

    net は 7 つの層をもつ dlnetwork オブジェクトです。2 番目と 3 番目の層は、それぞれ入れ子のニューラル ネットワークを含む networkLayer オブジェクトです。

    expandLayers関数を使用して networkLayer 層を展開し、ネットワークを解析します。

    netExpanded = expandLayers(net);
    analyzeNetwork(netExpanded)

    defaultexpanded.png

    アプリは、拡張ネットワーク netExpandednet よりも層を 4 つ多くもっていることを示しています。

    入れ子のニューラル ネットワークを表すカスタム層を使用して、TensorFlow ネットワークを再度インポートします。ネットワークを解析します。

    netCustom = importNetworkFromTensorFlow("CustomConvReluBN",PreferredNestingType="customlayer");
    Importing the saved model...
    Translating the model, this may take a few minutes...
    
    Warning: The namespace "CustomConvReluBN" already exists in the Current Folder, and will be overwritten.
    
    Finished translation. Assembling network...
    Import finished.
    
    analyzeNetwork(netCustom)

    custom.png

    netCustom には 7 つの層が含まれています。2 番目と 3 番目の層は、入れ子のニューラル ネットワークを表すカスタム層です。

    入力引数

    すべて折りたたむ

    TensorFlow モデル フォルダーの名前。文字ベクトルまたは string スカラーとして指定します。modelFolder は現在のフォルダー内にあるか、フォルダーへの絶対パスまたは相対パスを含んでいなければなりません。modelFolder には、.pb 拡張子をもつ saved_model ファイルと variables サブフォルダーが含まれていなければなりません。フォルダー名には、assets および assets.extra サブフォルダーを含めることもできます。

    • saved_model ファイルには、層グラフ アーキテクチャと学習オプション (オプティマイザー、損失、メトリクスなど) が格納されます。

    • variables サブフォルダーには、事前学習済みの TensorFlow ネットワークによって学習された重みが格納されます。既定では、importNetworkFromTensorFlow は重みをインポートします。

    • assets サブフォルダーには、層グラフで使用できる補足ファイル (語彙など) が格納されます。importNetworkFromTensorFlow は、assets 内のファイルをインポートしません。

    • assets.extra サブフォルダーには、層グラフと共存する補足ファイルが格納されます。

    TensorFlow を SavedModel 形式で保存する方法の詳細については、TensorFlow モデルの保存を参照してください。

    例: "MobileNet"

    例: "./MobileNet"

    名前と値の引数

    すべて折りたたむ

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

    例: importNetworkFromTensorflow(modelFolder,PreferredNestingType="customlayer") は、modelFolder 内のネットワークをインポートし、カスタム層を使用してネットワーク構成を表します。

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

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

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

    例: Namespace="MobileNet"

    例: Namespace="CustomLayers"

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

    • "networklayer"networkLayer 層オブジェクトを使用して、インポートされたネットワーク内のネットワーク構成を表現します。

    • "customlayer" — 入れ子のカスタム層を使用して、インポートされたネットワーク内のネットワーク構成を表現します。カスタム層の詳細については、カスタム深層学習層の定義を参照してください。

    例: PreferredNestingType="customlayer"

    データ型: char | string

    出力引数

    すべて折りたたむ

    事前学習済みの TensorFlow ネットワーク。初期化済みの dlnetwork オブジェクトとして返されます。場合によっては、インポートしたネットワークを初期化する必要があることがソフトウェアによって示されます。例については、TensorFlow ネットワークのインポートと初期化を参照してください。

    制限

    • importNetworkFromTensorFlow は、TensorFlow バージョン 2.0 ~ 2.15 までテストされています。

    • importNetworkFromTensorFlow は、Keras 2 API で作成されたモデルをサポートします。Keras 3 API で導入された新機能はサポートしていません。

    詳細

    すべて折りたたむ

    ヒント

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

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

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

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

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

    • MATLAB は 1 ベースのインデックスを使用しますが、Python® は 0 ベースのインデックスを使用します。つまり、配列の最初の要素のインデックスは、MATLAB と Python でそれぞれ 1 と 0 になります。MATLAB のインデックスの詳細については、配列インデックス付けを参照してください。MATLAB で、Python で作成されたインデックス (ind) の配列を使用するには、配列を ind+1 に変換します。

    • その他のヒントについては、Tips on Importing Models from TensorFlow, PyTorch, and ONNXを参照してください。

    アルゴリズム

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

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

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

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

    4. この関数は、プレースホルダー関数を含むカスタム層として TensorFlow 層をインポートします。importNetworkFromTensorFlow は、プレースホルダー関数を +Namespace 名前空間の +ops 内部名前空間に保存します。プレースホルダー関数は、ネットワークを使用する前に補完しなければなりません。

    場合によっては、インポートしたネットワークを初期化する必要があることがソフトウェアによって示されます。例については、TensorFlow ネットワークのインポートと初期化を参照してください。

    代替機能

    アプリ

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

    ブロック

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

    参照

    [1] TensorFlow. “TensorFlow.” Accessed July 3, 2023. https://www.tensorflow.org/.

    [2] TensorFlow. “Using the SavedModel Format | TensorFlow Core.” Accessed July 3, 2023. https://www.tensorflow.org/guide/saved_model.

    バージョン履歴

    R2023b で導入

    すべて展開する