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' です。この場合は、その畳み込み層を、クラスの数と同じ数のフィルターを持つ新しい畳み込み層に置き換えます。

新しい convolution2dLayer をキャンバスにドラッグします。元の畳み込み層と一致させるために、FilterSize1,1 に設定します。

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

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

最後の 2 次元畳み込み層を削除して、代わりに新しい層を結合します。

出力層の置き換え

転移学習用に、出力層を置き換える必要があります。[層のライブラリ] の最後までスクロールして、新しい classificationLayer をキャンバスにドラッグします。元の分類層を削除して、その位置に新しい層を結合します。

新しい出力層には、OutputSize を設定する必要はありません。学習時に、ディープ ネットワーク デザイナーによって層の出力クラスがデータから自動的に設定されます。

ネットワークの確認

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

ネットワークの学習

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

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

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

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

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

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

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

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

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

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

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

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

trainInfoStruct_1
trainInfoStruct_1 = struct with fields:
               TrainingLoss: [1×40 double]
           TrainingAccuracy: [1×40 double]
             ValidationLoss: [4.3374 NaN NaN NaN 2.4329 NaN NaN NaN NaN 1.3966 NaN NaN NaN NaN 0.7526 NaN NaN NaN NaN 0.6424 NaN NaN NaN NaN 0.6349 NaN NaN NaN NaN 0.5940 NaN NaN NaN NaN 0.5490 NaN NaN NaN NaN 0.5179]
         ValidationAccuracy: [10 NaN NaN NaN 15 NaN NaN NaN NaN 40 NaN NaN NaN NaN 70 NaN NaN NaN NaN 85 NaN NaN NaN NaN 90 NaN NaN NaN NaN 85 NaN NaN NaN NaN 90 NaN NaN NaN NaN 95]
              BaseLearnRate: [1×40 double]
        FinalValidationLoss: 0.5179
    FinalValidationAccuracy: 95

使用するネットワークと学習オプションを再作成する 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) + "%");

参考

関連するトピック