Main Content

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

転移学習入門

この例では、転移学習を使用して、事前学習済みの畳み込みニューラル ネットワークである SqueezeNet の再学習を行い、新しい一連のイメージを分類する方法を説明します。この例を試して、MATLAB® でどれほど簡単に深層学習を始めることができるか確認してください。

この例の手順を視覚的に確認するには、ビデオをご覧ください。

転移学習は、深層学習アプリケーションでよく使用されています。事前学習済みのネットワークを取得して、新しいタスクの学習の開始点として使用できます。通常は、転移学習によってネットワークを微調整する方が、ランダムに初期化された重みでゼロからネットワークに学習させるよりもはるかに簡単で時間がかかりません。少ない数の学習イメージを使用して、新しいタスクに学習済みの特徴を高速に転移できます。

データの解凍

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

unzip("MerchData.zip");

事前学習済みのネットワークの読み込み

ディープ ネットワーク デザイナーを開きます。

deepNetworkDesigner

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

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

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

データのインポート

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

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

データを 70% の学習データと 30% の検証データに分割します。

学習イメージに対して実行する拡張演算を指定します。データ拡張は、ネットワークで過適合が発生したり、学習イメージの正確な詳細が記憶されたりすることを防止するのに役立ちます。この例では、X 軸方向のランダムな反転、[-90,90] 度の範囲のランダムな回転、[1,2] の範囲のランダムな再スケーリングを実行します。

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

転移学習用のネットワークの編集

新しいイメージを分類するように SqueezeNet に再学習させるには、ネットワークの最後の 2 次元畳み込み層と最終分類層を編集します。SqueezeNet では、これらの層の名前はそれぞれ 'conv10''ClassificationLayer_predictions' です。

[デザイナー] ペインで 'conv10' 層を選択します。[プロパティ] ペインの下部で、[層のロックを解除] をクリックします。表示される警告ダイアログで、[ロックの強制解除] をクリックします。これにより層のプロパティのロックが解除され、それらを新しいタスクに適応できるようになります。

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

NumFilters プロパティを新しいクラス数 (この例では 5) に設定します。

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

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

ネットワークの学習

学習オプションを選択するには、[学習] タブを選択し、[学習オプション] をクリックします。初期学習率を小さい値に設定して、転移層での学習速度を下げます。上記の手順では、2 次元畳み込み層の学習率係数を大きくして、新しい最後の層での学習時間を短縮しています。この学習率設定の組み合わせによって、新しい層でのみ学習が急速に進み、他の層での学習速度は低下します。

この例では、[InitialLearnRate]0.0001[MaxEpochs]8[ValidationFrequency]5 に設定します。観測値が 55 個あるため、MiniBatchSize11 に設定して学習データを均等に分け、それぞれのエポックで必ず学習セット全体が使用されるようにします。

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

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

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

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

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

新しいイメージの分類

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

I = imread("MerchDataTest.jpg");

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

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

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

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

参照

[1] ImageNet. http://www.image-net.org

[2] Iandola, Forrest N., Song Han, Matthew W. Moskewicz, Khalid Ashraf, William J. Dally, and Kurt Keutzer. "SqueezeNet: AlexNet-level accuracy with 50x fewer parameters and <0.5 MB model size." Preprint, submitted November 4, 2016. https://arxiv.org/abs/1602.07360.

[3] Iandola, Forrest N. "SqueezeNet." https://github.com/forresti/SqueezeNet.

参考

| | |

関連するトピック