この例では、事前学習済みの SqueezeNet ネットワークを微調整して、新しいイメージ コレクションを分類する方法を説明します。このプロセスは転移学習と呼ばれ、通常、新しいネットワークに学習させるよりもはるかに簡単で時間がかかりません。これは、少ない数の学習イメージを使用して、新しいタスクに学習済みの特徴を適用できるためです。転移学習用のネットワークを対話形式で準備するには、ディープ ネットワーク デザイナーを使用します。
データの解凍
ワークスペースで、MathWorks Merch データセットを解凍します。これは、75 個の MathWorks の商品イメージから成る小さなデータセットであり、5 つの異なるクラス ("cap"、"cube"、"playing cards"、"screwdriver"、"torch") に属します。
ディープ ネットワーク デザイナーで SqueezeNet を開く
ディープ ネットワーク デザイナーを開きます。
事前学習済みネットワークの一覧から [SqueezeNet] を選択し、[開く] をクリックします。
ディープ ネットワーク デザイナーの [デザイナー] ペインにネットワーク全体が縮小表示されます。
ネットワークのプロットを確認します。マウスでズームインするには、Ctrl キーを押しながらスクロール ホイールを使用します。移動するには、方向キーを使用するか、スクロール ホイールを押したままでマウスをドラッグします。プロパティを表示する層を選択します。すべての層の選択を解除すると、[プロパティ] ペインにネットワークの概要が表示されます。
データのインポート
ディープ ネットワーク デザイナーにデータを読み込むには、[データ] タブにある [データのインポート] をクリックします。[データのインポート] ダイアログ ボックスが開きます。
[データ ソース] リストの [フォルダー] を選択します。[参照] をクリックし、解凍した MerchData フォルダーを選択します。
データを 70% の学習データと 30% の検証データに分割します。
学習イメージに対して実行する拡張演算を指定します。この例では、X 軸方向のランダムな反転、[-90,90] 度の範囲のランダムな回転、[1,2] の範囲のランダムな再スケーリングを実行します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。
[インポート] をクリックして、ディープ ネットワーク デザイナーにデータをインポートします。
データの可視化
ディープ ネットワーク デザイナーを使用すると、[データ] ペインにある学習データと検証データの分布を視覚的に検査できます。この例では、データセットにクラスが 5 つあることが確認できます。
転移学習用のネットワークの編集
ネットワークの畳み込み層は、入力イメージを分類するために、最後の学習可能な層と最終分類層が使用するイメージの特徴を抽出します。SqueezeNet のこれらの 2 つの層 'conv10'
および 'ClassificationLayer_predictions'
は、ネットワークによって抽出された特徴を組み合わせてクラス確率、損失値、および予測ラベルにまとめる方法に関する情報を含んでいます。新しいイメージを分類するために事前学習済みのネットワークを再学習させるには、これら 2 つの層を新しいデータセットに適応させた新しい層に置き換えます。
ほとんどのネットワークでは、学習可能な重みを持つ最後の層は全結合層です。SqueezeNet などの一部のネットワークでは、その代わりに最後の学習可能な層が最終畳み込み層となっています。この場合は、その畳み込み層を、クラスの数と同じ数のフィルターを持つ新しい畳み込み層に置き換えます。
[デザイナー] ペインで、新しい convolutional2dLayer
をキャンバスにドラッグします。元の畳み込み層と一致させるために、FilterSize
を 1,1
に設定します。NumFilters
を新しいデータのクラス数 (この例では 5
) に変更します。
WeightLearnRateFactor
および BiasLearnRateFactor
を 10 に設定して学習率を変更し、新しい層での学習速度を転移層より速くします。最後の 2 次元畳み込み層を削除して、代わりに新しい層を結合します。
出力層を置き換えます。[層のライブラリ] の最後までスクロールして、新しい classificationLayer
をキャンバスにドラッグします。元の出力層を削除して、代わりに新しい層を結合します。
ネットワークの確認
編集したネットワークの学習の準備が整っていることを確認するには、[解析] をクリックし、深層学習ネットワーク アナライザーによってエラー 0 が報告されていることを確認します。
ネットワークの学習
学習オプションの指定。[学習] タブを選択し、[学習オプション] をクリックします。
InitialLearnRate
を小さい値に設定して、転移層での学習速度を下げます。
各エポックで 1 回、検証データに対する精度が計算されるように、ValidationFrequency
を指定します。
小さい数のエポックを指定します。エポックとは、学習データセット全体の完全な学習サイクルのことです。転移学習の場合、同じエポック数の学習を行う必要はありません。
ミニバッチのサイズ、つまり各反復で使用するイメージの数を指定します。それぞれのエポックで必ずデータセット全体が使用されるように、学習サンプルの数を均等に分割するようミニバッチのサイズを設定します。
この例では、InitialLearnRate
を 0.0001
に、ValidationFrequency
を 5
に、MaxEpochs
を 8
に設定します。観測値が 55 個あるため、MiniBatchSize
を 11 に設定します。
指定した学習オプションでネットワークを学習させるには、[閉じる] をクリックしてから [学習] をクリックします。
ディープ ネットワーク デザイナーでは、学習の進行状況の可視化と監視が行えます。必要に応じて、学習オプションを編集してネットワークを再学習させることができます。
結果のエクスポートと MATLAB コードの生成
学習した重みを含むネットワーク アーキテクチャをエクスポートするには、[学習] タブの [エクスポート]、[学習済みネットワークと結果のエクスポート] を選択します。ディープ ネットワーク デザイナーによって、学習済みネットワークが変数 trainedNetwork_1
に、学習情報が変数 trainInfoStruct_1
にエクスポートされます。
trainInfoStruct_1 = struct with fields:
TrainingLoss: [1×40 double]
TrainingAccuracy: [1×40 double]
ValidationLoss: [4.8267 NaN NaN NaN 2.1034 NaN NaN NaN NaN 1.2332 NaN NaN NaN NaN 0.6614 NaN NaN NaN NaN 0.4312 NaN NaN NaN NaN 0.2878 NaN NaN NaN NaN 0.2472 NaN NaN NaN NaN 0.2647 NaN NaN NaN NaN 0.2893]
ValidationAccuracy: [10 NaN NaN NaN 10 NaN NaN NaN NaN 40 NaN NaN NaN NaN 80 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×40 double]
FinalValidationLoss: 0.2893
FinalValidationAccuracy: 95
使用するネットワークと学習オプションを再作成する MATLAB コードを生成することもできます。[学習] タブの [エクスポート]、[学習用コードの生成] を選択します。MATLAB コードを確認して、学習用のデータの準備、ネットワーク アーキテクチャの作成、およびネットワークの学習をプログラムによって行う方法を学びます。
新しいイメージの分類
学習済みネットワークを使用して分類する新しいイメージを読み込みます。
イメージ サイズは学習の間、ネットワークの入力サイズに合うようにディープ ネットワーク デザイナーにより変更されます。ネットワークの入力サイズを確認するには、[デザイナー] ペインに移動して imageInputLayer
(最初の層) を選択します。このネットワークの入力サイズは 227 x 227 です。
ネットワークの入力サイズに合うようにテスト イメージをサイズ変更します。
学習済みネットワークを使用してテスト イメージを分類します。