ドキュメンテーション

最新のリリースでは、このページがまだ翻訳されていません。 このページの最新版は英語でご覧になれます。

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

この例では、ディープ ネットワーク デザイナー アプリを使用して転移学習用のネットワークを対話形式で準備する方法を説明します。転移学習は、事前学習済みの深層学習ネットワークを利用して、新しいタスクを学習するように微調整するプロセスです。通常は、転移学習を使用する方が、ネットワークにゼロから学習させるよりもはるかに簡単で時間がかかりません。これは、少ない数の学習イメージを使用して、新しいタスクに学習済みの特徴を高速に転移できるためです。

次の手順に従って転移学習を実行します。

  1. 事前学習済みのネットワークを選択し、アプリにインポートします。

  2. 最後の層を、新しいデータセットに適応させた新しい層に置き換えます。

    1. 学習イメージの新しいクラス数を指定します。

    2. 学習率を設定して、新しい層での学習速度を転移層より速くします。

  3. コマンド ラインで学習用のネットワークをエクスポートします。

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

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

使用するデータが ImageNet のデータと大きく異なる場合、新しいネットワークに学習させる方がよいこともあります。たとえば、非常に小さいイメージ、スペクトログラム、またはイメージ以外のデータを使用する場合、代わりにディープ ネットワーク デザイナーを使用したネットワークの構築を参照してください。

事前学習済みの GoogLeNet ネットワークを読み込みます。ネットワークをダウンロードする必要がある場合、関数によってアドオン エクスプローラーへのリンクが表示されます。

net = googlenet

ディープ ネットワーク デザイナーへのネットワークのインポート

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

deepNetworkDesigner

[インポート] をクリックし、ネットワークを選択してワークスペースから読み込みます。ディープ ネットワーク デザイナーにネットワーク全体が縮小表示されます。

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

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

ネットワークは、最後の学習可能な層と最終分類層を使用して入力イメージを分類します。新しいイメージを分類するように事前学習済みのネットワークに再学習させるには、これら最後の層を、新しいデータセットに適応させた新しい層に置き換えます。

クラス数の変更

転移学習に事前学習済みネットワークを使用するには、新しいデータセットに一致するようにクラス数を変更する必要があります。まず、ネットワークの最後の学習可能な層を見つけます。GoogLeNet、およびほとんどの事前学習済みネットワークでは、最後の学習可能な層は全結合層です。層 loss3-classifier をクリックしてそのプロパティを表示します。

OutputSize プロパティは、分類問題のクラス数を定義します。[プロパティ] ペインには、事前学習済みネットワークが 1,000 個のクラスを分類できることが示されています。OutputSize は編集できません。

クラス数を変更するには、新しい FullyConnectedLayer[層] ペインからキャンバスにドラッグします。OutputSize を編集して使用するデータのクラス数にします。この例では、5 を入力します。元の loss3-classifier 層を削除して、その位置に新しい層を結合します。

最後の層である分類出力層を選択します。[プロパティ] ペインの層のプロパティ OutputSize にはクラス数が 1,000 個と表示され、最初のいくつかのクラス名が表示されています。

転移学習用に、出力層を置き換える必要があります。[層] パレットの最後までスクロールして、新しい ClassificationOutputLayer をキャンバスにドラッグします。元の output 層を削除して、その位置に新しい層を結合します。新しい出力層には、OutputSize を設定する必要はありません。学習時に、trainNetwork によって層の出力クラスがデータから自動的に設定されます。

新しい層での学習の高速化

学習率を編集して、新しい層での学習速度を転移層より速くします。新しい FullyConnectedLayer 層で、WeightLearnRateFactor および BiasLearnRateFactor を 10 に設定します。

ネットワークの確認

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

学習用のネットワークのエクスポート

ネットワークをワークスペースにエクスポートするには、ディープ ネットワーク デザイナーに戻って [エクスポート] をクリックします。ディープ ネットワーク デザイナーは、編集したネットワーク層を格納する lgraph_1 という新しい変数にネットワークをエクスポートします。エクスポート後、層変数を関数 trainNetwork に指定できます。

ディープ ネットワーク デザイナーからエクスポートされたネットワークの学習

この例では、ディープ ネットワーク デザイナーからエクスポートされたネットワークを転移学習に使用する方法を説明します。アプリでネットワークを準備した後、次のことを行う必要があります。

  • イメージのサイズ変更。

  • 学習オプションの指定。

  • ネットワークの学習。

転移学習用のイメージのサイズ変更

転移学習用に、事前学習済みネットワークの入力サイズに一致するようにイメージのサイズを変更します。ネットワークのイメージの入力サイズを確認するには、ディープ ネットワーク デザイナーで ImageInputLayer を調べます。GoogLeNet の場合、InputSize224x224 です。

サンプル イメージを試してみます。イメージを解凍してイメージ データストアとして読み込みます。この非常に小さいデータセットには 5 つのクラスの 75 枚のイメージのみが含まれています。データを 70% の学習データと 30% の検証データに分割します。

unzip('MerchData.zip');
imds = imageDatastore('MerchData', ...
    'IncludeSubfolders',true, ...
    'LabelSource','foldernames'); 
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7);

各クラス用のサブフォルダーがあるフォルダーに学習イメージが含まれている場合、MerchData をフォルダーの場所に置き換えることによって、データのデータストアを作成できます。クラス数を確認します。データに一致するクラス数を使用して、ネットワークを転移学習用に準備しなければなりません。

事前学習済みネットワーク GoogLeNet に一致するようにイメージ データストア内のイメージのサイズを変更するには、次のようにします。

augimdsTrain = augmentedImageDatastore([224 224],imdsTrain);
augimdsValidation = augmentedImageDatastore([224 224],imdsValidation);

イメージに変換を適用して、ネットワークの過適合を防止することもできます。詳細は、imageDataAugmenter を参照してください。

転移学習用の学習オプションの設定

学習前に、いくつかのオプションを指定します。

  • 転移学習用に、InitialLearnRate を小さい値に設定して、転移層での学習速度を下げます。アプリでは、全結合層の学習率係数を大きくして、新しい最後の層での学習時間を短縮しています。この学習率設定の組み合わせによって、新しい層でのみ学習が急速に進み、他の層での学習速度は低下します。

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

  • ミニバッチのサイズ、つまり各反復で使用するイメージの数を指定します。

  • 検証データと少ない検証頻度を指定します。

  • 学習のプロットをオンにして、学習中に進行状況を監視します。

options = trainingOptions('sgdm', ...
    'MiniBatchSize',10, ...
    'MaxEpochs',6, ...
    'InitialLearnRate',1e-4, ...
    'Shuffle','every-epoch', ...
    'ValidationData',augimdsValidation, ...
    'ValidationFrequency',3, ...
    'Verbose',false, ...
    'Plots','training-progress');

ネットワークの学習

ネットワークに学習させるため、アプリからエクスポートした層 (ここでは lgraph_1)、サイズを変更したイメージ、および学習オプションを関数 trainNetwork に指定します。trainNetwork は既定で、GPU を利用できる場合は、その GPU を使用します (Parallel Computing Toolbox™ が必要)。そうでない場合は CPU が使用されます。データセットのサイズが非常に小さいため、学習は短時間で終了します。

net = trainNetwork(augimdsTrain,lgraph_1,options);

検証イメージの分類による学習済みネットワークのテスト

微調整したネットワークを使用して検証イメージを分類し、分類精度を計算します。

[YPred,probs] = classify(net,augimdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 0.9500

4 個のサンプル検証イメージを、予測ラベルおよび予測確率と共に表示します。

idx = randperm(numel(imdsValidation.Files),4);
figure
for i = 1:4
    subplot(2,2,i)
    I = readimage(imdsValidation,idx(i));
    imshow(I)
    label = YPred(idx(i));
    title(string(label) + ", " + num2str(100*max(probs(idx(i),:)),3) + "%");
end

参考

関連するトピック