Main Content

このページの内容は最新ではありません。最新版の英語を参照するには、ここをクリックします。

ディープ ネットワーク デザイナーを使用した転移学習

この例では、ディープ ネットワーク デザイナー アプリを使用して転移学習をインタラクティブに実行する方法を説明します。

転移学習は、事前学習済みの深層学習ネットワークを利用して、新しいタスクを学習するように微調整するプロセスです。通常は、転移学習を使用する方が、ネットワークにゼロから学習させるよりも簡単で時間もかかりません。少量のデータを使用して、新しいタスクに学習済みの特徴を高速に転移できます。

ディープ ネットワーク デザイナーでイメージ分類のための転移学習を実行するには、次の手順に従います。

  1. ディープ ネットワーク デザイナー アプリを開いて事前学習済みのネットワークを選択します。

  2. 新しいデータセットをインポートします。

  3. 最後の層を新しいデータ セットに適応させます。

  4. 学習率を高く設定して、転移層での学習を速くします。

  5. ディープ ネットワーク デザイナーを使用してネットワークに学習させるか、ネットワークをエクスポートしてコマンド ラインで学習させます。

データの解凍

ワークスペースで、MathWorks Merch データセットを解凍します。これは、75 個の MathWorks の商品イメージから成る小さなデータセットであり、5 つの異なるクラス ("cap"、"cube"、"playing cards"、"screwdriver"、"torch") に属します。

unzip("MerchData.zip");

事前学習済みのネットワークの選択

ディープ ネットワーク デザイナーを開くには、[アプリ] タブの [機械学習および深層学習] でアプリのアイコンをクリックします。あるいは、コマンド ラインからアプリを開くこともできます。

deepNetworkDesigner

ディープ ネットワーク デザイナーには、広範囲のイメージに適した豊富な特徴表現を学習している、さまざまな事前学習済みのイメージ分類ネットワークが用意されています。転移学習は、使用するイメージが、ネットワークの学習時にもともと使用されたイメージに類似している場合に特に効果を発揮します。使用する学習イメージが ImageNet データベースに含まれるような自然イメージの場合、どの事前学習済みネットワークも適しています。使用可能なネットワークの一覧、およびネットワークを比較する方法については、事前学習済みの深層ニューラル ネットワークを参照してください。

使用するデータが ImageNet のデータと大きく異なる場合 (たとえば、非常に小さいイメージ、スペクトログラム、またはイメージ以外のデータを使用する場合) は、新しいネットワークに学習させる方が良いこともあります。ネットワークにゼロから学習させる方法を示す例については、ディープ ネットワーク デザイナーを使用したシンプルなシーケンス分類ネットワークの作成およびディープ ネットワーク デザイナーでの簡単なセマンティック セグメンテーション ネットワークの学習を参照してください。

SqueezeNet では追加のサポート パッケージが必要ありません。その他の事前学習済みネットワークでは、必要なサポート パッケージがインストールされていない場合、[インストール] オプションがアプリに表示されます。

事前学習済みネットワークの一覧から [SqueezeNet] を選択し、[開く] をクリックします。

ネットワークの調査

ディープ ネットワーク デザイナーの [デザイナー] ペインにネットワーク全体が縮小表示されます。

ネットワークのプロットを確認します。マウスでズームインするには、Ctrl キーを押しながらスクロール ホイールを使用します。移動するには、方向キーを使用するか、スクロール ホイールを押したままでマウスをドラッグします。プロパティを表示する層を選択します。すべての層の選択を解除すると、[プロパティ] ペインにネットワークの概要が表示されます。

データのインポート

ディープ ネットワーク デザイナーにデータを読み込むには、[データ] タブで、[データのインポート][イメージ分類データのインポート] をクリックします。

[データ ソース] リストの [フォルダー] を選択します。[参照] をクリックし、解凍した MerchData フォルダーを選択します。

イメージ拡張

学習データにイメージ拡張を適用するよう選択することが可能です。ディープ ネットワーク デザイナー アプリには以下の拡張オプションが用意されています。

  • X 軸方向のランダムな反転

  • Y 軸方向のランダムな反転

  • ランダムな回転

  • ランダムな再スケーリング

  • ランダムな水平方向の平行移動

  • ランダムな垂直方向の平行移動

ランダム化された "拡張" をデータに適用して、実質的に学習データの量を増やすことができます。拡張では、イメージ データの歪みに対して不変になるようにネットワークに学習させることもできます。たとえば、入力イメージに存在する回転に対してネットワークが不変になるように、入力イメージにランダムな回転を追加できます。

この例では、X 軸方向のランダムな反転、[-90,90] 度の範囲のランダムな回転、[1,2] の範囲のランダムな再スケーリングを実行します。

検証データ

検証データを学習データから分割するか (ホールドアウト検証と呼ばれる)、それとも他のソースからインポートするかを選択することも可能です。検証では、学習データと比較して新しいデータのモデル パフォーマンスが推定され、パフォーマンスの監視や過適合の防止に役立ちます。

この例では、イメージの 30% を検証に使用します。

[インポート] をクリックして、ディープ ネットワーク デザイナーにデータをインポートします。

データの可視化

ディープ ネットワーク デザイナーを使用すると、[データ] タブにある学習データと検証データの分布を視覚的に検査できます。この例では、データセットにクラスが 5 つあることが確認できます。各クラスからのランダムな観測値も確認できます。

学習用のネットワークの準備

[デザイナー] ペインのネットワークを編集して、データの新しいクラス数を指定します。転移学習用のネットワークを準備するために、最後の学習可能な層と最終分類層を編集します。

最後の学習可能な層の編集

転移学習に事前学習済みネットワークを使用するには、新しいデータセットに一致するようにクラス数を変更しなければなりません。まず、ネットワークの最後の学習可能な層を見つけます。SqueezeNet の最後の学習可能な層は、最後の畳み込み層 'conv10' です。'conv10' 層を選択します。[プロパティ] ペインの下部で、[層のロックを解除] をクリックします。表示される警告ダイアログで、[ロックの強制解除] をクリックします。これにより層のプロパティのロックが解除され、それらを新しいタスクに適応できるようになります。

R2023b より前: 層のプロパティを編集するには、層のロックを解除するのではなく、層を置き換えなければなりません。新しい 2 次元畳み込み層で、FilterSize を [1 1] に設定します。

NumFilters プロパティは、分類問題のクラス数を定義します。NumFilters を新しいデータのクラス数 (この例では 5) に変更します。

WeightLearnRateFactor および BiasLearnRateFactor10 に設定して学習率を変更し、新しい層での学習速度を転移層より速くします。

出力層の編集

次に、出力層を構成します。最終分類層 ClassificationLayer_predictions を選択し、[層のロックを解除] をクリックしてから、[ロックの強制解除] をクリックします。ロックが解除された出力層に対して OutputSize を設定する必要はありません。学習時に、ディープ ネットワーク デザイナーによって層の出力クラスがデータから自動的に設定されます。

ネットワークの確認

ネットワークの学習の準備が整っていることを確認するには、[解析] をクリックします。深層学習ネットワーク アナライザーによってエラー 0 が報告されている場合、編集したネットワークの学習の準備が整っています。

ネットワークの学習

ディープ ネットワーク デザイナーでは、アプリにインポートした、あるいはアプリで作成したネットワークに学習させることが可能です。

既定の設定でネットワークに学習させるには、[学習] タブの [学習] をクリックします。既定の学習オプションは大きなデータ セットに適しています。小さなデータ セットの場合は、ミニバッチ サイズを小さくし、検証頻度を減らします。

学習をさらに細かく制御するには、[学習オプション] をクリックして学習の設定を選択します。

  • 初期学習率を小さい値に設定して、転移層での学習速度を下げます。

  • 各エポックで 1 回、検証データに対する精度が計算されるように、検証頻度を指定します。

  • 小さい数のエポックを指定します。エポックとは、学習データセット全体の完全な学習サイクルのことです。転移学習の場合、同じエポック数の学習を行う必要はありません。

  • ミニバッチのサイズ、つまり各反復で使用するイメージの数を指定します。それぞれのエポックで必ずデータセット全体が使用されるように、学習サンプルの数を均等に分割するようミニバッチのサイズを設定します。

この例では、[InitialLearnRate]0.0001[MaxEpochs]8[ValidationFrequency]5 に設定します。観測値が 55 個あるため、MiniBatchSize11 に設定して学習データを均等に分け、各エポックで必ず学習データ セット全体が使用されるようにします。学習オプションの詳細については、trainingOptionsを参照してください。

指定した学習オプションでネットワークに学習させるには、[OK] をクリックしてから [学習] をクリックします。

ディープ ネットワーク デザイナーでは、学習の進行状況の可視化と監視が行えます。必要に応じて、学習オプションを編集してネットワークを再学習させることができます。

学習プロットをイメージとして保存するには、[学習プロットのエクスポート] をクリックします。

結果のエクスポートと MATLAB コードの生成

学習した重みを含むネットワーク アーキテクチャをエクスポートするには、[学習] タブの [エクスポート][学習済みネットワークと結果のエクスポート] を選択します。ディープ ネットワーク デザイナーによって、学習済みネットワークが変数 trainedNetwork_1 に、学習情報が変数 trainInfoStruct_1 にエクスポートされます。

trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
               TrainingLoss: [3.1794 4.5479 2.2169 2.9521 1.9841 2.2164 1.4329 1.6750 1.6514 1.2448 0.9932 0.8375 0.4307 0.7229 0.6570 0.8118 0.4625 0.3193 0.5299 0.1430 0.3089 0.2988 0.1780 0.0959 0.1691 0.5496 0.1991 0.0629 0.0672 … ] (1×40 double)
           TrainingAccuracy: [27.2727 0 18.1818 27.2727 18.1818 9.0909 45.4545 27.2727 45.4545 45.4545 72.7273 72.7273 90.9091 81.8182 81.8182 72.7273 90.9091 100 81.8182 100 81.8182 90.9091 100 100 100 81.8182 90.9091 100 100 90.9091 … ] (1×40 double)
             ValidationLoss: [3.0507 NaN NaN NaN 1.5660 NaN NaN NaN NaN 0.7928 NaN NaN NaN NaN 0.5077 NaN NaN NaN NaN 0.3644 NaN NaN NaN NaN 0.2133 NaN NaN NaN NaN 0.1448 NaN NaN NaN NaN 0.1662 NaN NaN NaN NaN 0.2037]
         ValidationAccuracy: [15 NaN NaN NaN 35 NaN NaN NaN NaN 75.0000 NaN NaN NaN NaN 90 NaN NaN NaN NaN 90 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95 NaN NaN NaN NaN 95]
              BaseLearnRate: [1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 1.0000e-04 … ] (1×40 double)
        FinalValidationLoss: 0.2037
    FinalValidationAccuracy: 95
     OutputNetworkIteration: 40

使用するネットワークと学習オプションを再作成する MATLAB コードを生成することもできます。[学習] タブの [エクスポート][学習用コードの生成] を選択します。MATLAB コードを確認して、学習用のデータの準備、ネットワーク アーキテクチャの作成、およびネットワークの学習をプログラムによって行う方法を学びます。

新しいイメージの分類

学習済みネットワークを使用して分類する新しいイメージを読み込みます。

I = imread("MerchDataTest.jpg");

イメージ サイズは学習の間、ネットワークの入力サイズに合うようにディープ ネットワーク デザイナーにより変更されます。ネットワークの入力サイズを確認するには、[デザイナー] ペインに移動して imageInputLayer (最初の層) を選択します。このネットワークの入力サイズは 227 x 227 です。

ネットワークの入力サイズに合うようにテスト イメージをサイズ変更します。

I = imresize(I, [227 227]);

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

[YPred,probs] = classify(trainedNetwork_1,I);
imshow(I)
label = YPred;
title(string(label) + ", " + num2str(100*max(probs),3) + "%");

参考

関連するトピック