メインコンテンツ

importTensorFlowNetwork

(削除予定) 事前学習済みの TensorFlow ネットワークのインポート

R2021a 以降

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

    説明

    net = importTensorFlowNetwork(modelFolder) は、SavedModel 形式 (これは TensorFlow™ 2 とのみ互換性があります) でモデルが格納されているフォルダー modelFolder から事前学習済みの TensorFlow ネットワークをインポートします。この関数は、TensorFlow-Keras の Sequential API または Functional API を使用して作成された TensorFlow ネットワークをインポートできます。importTensorFlowNetwork は、saved_model.pb ファイルで定義された層、および variables サブフォルダーに格納された学習済みの重みをインポートし、ネットワーク netDAGNetwork オブジェクトまたは dlnetwork オブジェクトとして返します。

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

    メモ

    カスタムの TensorFlow 層をインポートしたとき、またはソフトウェアが TensorFlow 層をそれと等価な組み込みの MATLAB® 層に変換できないとき、importTensorFlowNetwork はカスタム層の生成を試みます。ソフトウェアによる変換がサポートされている層の一覧については、組み込みの MATLAB 層への変換がサポートされている TensorFlow-Keras 層を参照してください。

    importTensorFlowNetwork は、生成されたカスタム層および関連する TensorFlow 演算子を名前空間 +modelFolder に保存します。

    importTensorFlowNetwork は、組み込みの MATLAB 層への変換がサポートされていない各 TensorFlow 層のカスタム層を自動生成しません。サポートされていない層の処理方法の詳細については、ヒントを参照してください。

    net = importTensorFlowNetwork(modelFolder,Name,Value) は、1 つ以上の名前と値の引数で指定された追加オプションを使用して、事前学習済みの TensorFlow ネットワークをインポートします。たとえば、'OutputLayerType','classification' はネットワークを DAGNetwork としてインポートしますが、その際、インポートされたネットワーク アーキテクチャの末尾に分類出力層が追加されます。

    すべて折りたたむ

    SavedModel 形式で保存された事前学習済みの TensorFlow ネットワークを DAGNetwork オブジェクトとしてインポートし、インポートしたネットワークを使用してイメージを分類します。

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

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

    クラス名を指定します。

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

    SavedModel 形式で保存された TensorFlow ネットワークをインポートします。既定では、importTensorFlowNetwork はネットワークを DAGNetwork オブジェクトとしてインポートします。イメージ分類問題用に出力層のタイプを指定します。

    net = importTensorFlowNetwork(modelFolder,'OutputLayerType','classification','Classes',classNames)
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation. Assembling network...
    Import finished.
    
    net = 
      DAGNetwork with properties:
    
             Layers: [13×1 nnet.cnn.layer.Layer]
        Connections: [13×2 table]
         InputNames: {'input_1'}
        OutputNames: {'ClassificationLayer_activation_1'}
    
    

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

    plot(net)
    title('DAG Network Architecture')

    分類するイメージを読み取り、そのイメージのサイズを表示します。このイメージは、サイズが 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)) を使用してイメージのサイズを変更しなければなりません。

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

    事前学習済みのネットワークを使用してイメージを分類します。

    label = classify(net,I);

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

    imshow(I)
    title(['Classification result ' char(label)])

    SavedModel 形式で保存された事前学習済みの TensorFlow ネットワークを dlnetwork オブジェクトとしてインポートし、インポートしたネットワークを使用してクラス ラベルを予測します。

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

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

    クラス名を指定します。

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

    SavedModel 形式で保存された TensorFlow ネットワークを dlnetwork オブジェクトとしてインポートします。

    net = importTensorFlowNetwork(modelFolder,'TargetNetwork','dlnetwork')
    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
    
    

    分類するイメージを読み取り、そのイメージのサイズを表示します。このイメージは、サイズが 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),'SSCB');

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

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

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

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

    SavedModel 形式で保存された事前学習済みの TensorFlow ネットワークを DAGNetwork オブジェクトとしてインポートし、インポートしたネットワークを使用してイメージを分類します。インポートしたネットワークには、組み込みの MATLAB 層への変換がサポートされていない層が含まれています。これらの層をインポートすると、カスタム層がソフトウェアによって自動生成されます。

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

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

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

    クラス名を指定します。

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

    SavedModel 形式で保存された TensorFlow ネットワークをインポートします。既定では、importTensorFlowNetwork はネットワークを DAGNetwork オブジェクトとしてインポートします。イメージ分類問題用に出力層のタイプを指定します。

    net = importTensorFlowNetwork(modelFolder,'OutputLayerType','classification','Classes',classNames);
    Warning: 'importTensorFlowNetwork' is not recommended and will be removed in a future release. To import TensorFlow models, use importNetworkFromTensorFlow function.
    
    Importing the saved model...
    Translating the model, this may take a few minutes...
    Finished translation. Assembling network...
    Import finished.
    

    インポートしたネットワークに、組み込みの MATLAB 層への変換がサポートされていない層が含まれている場合、importTensorFlowNetwork は、これらの層の代わりにカスタム層を自動生成できます。importTensorFlowNetwork は、生成した各カスタム層を、現在のフォルダー内の名前空間 +digitsDAGnetwithnoise に個別の .m ファイルとして保存します。

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

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

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

    plot(net)
    title('DAG Network Architecture')

    分類するイメージを読み取ります。

    digitDatasetPath = fullfile(toolboxdir('nnet'),'nndemos','nndatasets','DigitDataset');
    I = imread(fullfile(digitDatasetPath,'5','image4009.png'));

    事前学習済みのネットワークを使用してイメージを分類します。

    label = classify(net,I);

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

    imshow(I)
    title(['Classification result ' char(label)])

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

    補助関数

    この節では、この例で使用されている補助関数 findCustomLayers のコードを示します。findCustomLayers は、importTensorFlowNetwork によって自動生成されたカスタム層の indices を返します。

    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

    入力引数

    すべて折りたたむ

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

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

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

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

    • サブフォルダー assets.extra には、モデルと共存する補足ファイル (ユーザーのための情報など) が格納されます。

    例: 'MobileNet'

    例: './MobileNet'

    名前と値の引数

    すべて折りたたむ

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

    R2021a より前では、コンマを使用して名前と値をそれぞれ区切り、Name を引用符で囲みます。

    例: importTensorFlowNetwork(modelFolder,'TargetNetwork','dagnetwork','OutputLayerType','classification') は、ネットワークを DAGNetwork オブジェクトとして modelFolder からインポートし、自動生成したカスタム層を現在のフォルダー内の名前空間 +modelFolder に保存して、インポートしたネットワーク アーキテクチャの末尾に分類出力層を追加します。

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

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

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

    例: Namespace="MobileNet"

    例: Namespace="CustomLayers"

    Deep Learning Toolbox ネットワークのターゲット タイプ。'dagnetwork' または 'dlnetwork' として指定します。

    • ネットワークを DAGNetwork オブジェクトとしてインポートするには、'TargetNetwork'dagnetwork' として指定します。この場合、net には、TensorFlow の SavedModel 損失関数または名前と値の引数 'OutputLayerType' によって指定された出力層が含まれていなければなりません。

    • ネットワークを dlnetwork オブジェクトとしてインポートするには、'TargetNetwork'dlnetwork' として指定します。この場合、net には出力層が含まれません。

    例: 'TargetNetwork','dlnetwork'

    インポートされたネットワーク アーキテクチャの最後に importTensorFlowNetwork によって追加される出力層のタイプ。'classification''regression'、または 'pixelclassification' として指定します。pixelClassificationLayer (Computer Vision Toolbox) オブジェクトを追加するには、Computer Vision Toolbox™ が必要です。

    • 'TargetNetwork''dagnetwork' として指定し、modelFolder 内の SavedModel によって損失関数が指定されていない場合、名前と値の引数 'OutputLayerType' に値を割り当てなければなりません。DAGNetwork オブジェクトは出力層をもたなければなりません。

    • 'TargetNetwork''dlnetwork' として指定した場合、importTensorFlowNetwork は名前と値の引数 'OutputLayerType' を無視します。dlnetwork オブジェクトは出力層をもちません。

    例: 'OutputLayerType','classification'

    ネットワークの入力イメージのサイズ。グレースケール イメージの [height,width] またはカラー イメージの [height,width,channels] にそれぞれ対応する、2 個または 3 個の数値のベクトルとして指定します。modelFolder 内の saved_model.pb ファイルで入力サイズが指定されていない場合、ネットワークはこの情報を使用します。

    例: 'ImageInputSize',[28 28]

    出力層のクラス。categorical ベクトル、string 配列、文字ベクトルの cell 配列、または 'auto' として指定します。string 配列または文字ベクトルの cell 配列 str を指定した場合、importTensorFlowNetwork によって出力層のクラスが categorical(str,str) に設定されます。Classes'auto' の場合、importTensorFlowNetwork によってクラスが categorical(1:N) に設定されます。ここで、N はクラスの数です。

    • 'TargetNetwork''dagnetwork' として指定した場合、importTensorFlowNetwork は、クラスに関する情報を DAGNetwork オブジェクトの出力層に保存します。

    • 'TargetNetwork''dlnetwork' として指定した場合、importTensorFlowNetwork は名前と値の引数 'Classes' を無視します。dlnetwork オブジェクトは、クラスに関する情報を保存する出力層をもちません。

    例: 'Classes',{'0','1','3'}

    例: 'Classes',categorical({'dog','cat'})

    データ型: char | categorical | string | cell

    コマンド ウィンドウにインポートの進行状況を表示するかどうかのインジケーター。数値または logical の 1 (true) か 0 (false) として指定します。

    例: 'Verbose','true'

    出力引数

    すべて折りたたむ

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

    • ネットワークを DAGNetwork オブジェクトとしてインポートするには、'TargetNetwork'dagnetwork' として指定します。その後、DAGNetwork オブジェクト上で、関数 classify を使用してクラス ラベルを予測します。

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

    詳細

    すべて折りたたむ

    ヒント

    • インポートしたネットワークに、組み込みの MATLAB 層への変換がサポートされていない層が含まれており (組み込みの MATLAB 層への変換がサポートされている TensorFlow-Keras 層を参照)、importTensorFlowNetwork がカスタム層を生成しない場合、importTensorFlowNetwork はエラーを返します。この場合でも、importTensorFlowLayers を使用してネットワーク アーキテクチャをインポートできます。

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

    代替機能

    TensorFlow ネットワークを SavedModel 形式でインポートするには、importTensorFlowNetwork または importTensorFlowLayers を使用します[2]。または、ネットワークが HDF5 形式か JSON 形式の場合は、importKerasNetworkimportKerasLayers を使用してネットワークをインポートします。

    参照

    [2] Using the SavedModel format. https://www.tensorflow.org/guide/saved_model.

    バージョン履歴

    R2021a で導入

    すべて展開する