ドキュメンテーション

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

ディープ ネットワーク デザイナー入門

この例では、事前学習済みの GoogLeNet ネットワークを微調整して、新しいイメージ コレクションを分類する方法を説明します。このプロセスは転移学習と呼ばれ、通常、新しいネットワークに学習させるよりもはるかに簡単で時間がかかりません。これは、少ない数の学習イメージを使用して、新しいタスクに学習済みの特徴を適用できるためです。転移学習用のネットワークを対話形式で準備するには、ディープ ネットワーク デザイナーを使用します。

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

事前学習済みの GoogLeNet ネットワークを読み込みます。ネットワークをダウンロードする必要がある場合、ダウンロード用リンクを使用します。

net = googlenet;

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

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

deepNetworkDesigner

[インポート] をクリックして、ワークスペースからネットワークを選択します。ディープ ネットワーク デザイナーにネットワーク全体が縮小表示されます。ネットワークのプロットを確認します。マウスでズームインするには、Ctrl キーを押しながらスクロール ホイールを使用します。

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

新しいイメージを分類するように事前学習済みのネットワークに再学習させるには、最後の層を新しいデータセットに適応させた新しい層に置き換えます。クラス数をデータに合うように変更しなければなりません。

新しい fullyConnectedLayer[層のライブラリ] からキャンバスにドラッグします。OutputSize を編集して新しいデータのクラス数 (この例では 5) にします。

学習率を編集して、新しい層での学習速度を転移層より速くします。WeightLearnRateFactor および BiasLearnRateFactor を 10 に設定します。最後の全結合層を削除して、代わりに新しい層を結合します。

出力層を置き換えます。[層のライブラリ] の最後までスクロールして、新しい classificationLayer をキャンバスにドラッグします。元の output 層を削除して、代わりに新しい層を結合します。

ネットワークの確認

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

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

ディープ ネットワーク デザイナーに戻り、[エクスポート] をクリックします。ディープ ネットワーク デザイナーは、編集したネットワーク層を含む lgraph_1 という新規変数にネットワークをエクスポートします。これで、層の変数を関数 trainNetwork に指定できます。ネットワーク アーキテクチャを再作成し、MATLAB ワークスペースの layerGraph オブジェクトまたは Layer 配列として返す MATLAB® コードを生成することもできます。

データの読み込みおよびネットワークの学習

新しいイメージを解凍してイメージ データストアとして読み込みます。データを 70% の学習データと 30% の検証データに分割します。

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

事前学習済みのネットワークの入力サイズに一致するようにイメージのサイズを変更します。

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

学習オプションを指定します。

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

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

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

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

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

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

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

netTransfer = trainNetwork(augimdsTrain,lgraph_1,options);

学習済みネットワークのテスト

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

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

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

idx = randperm(numel(augimdsValidation.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

詳細を確認して他の事前学習済みのネットワークを試してみるには、ディープ ネットワーク デザイナーを参照してください。

参考

関連するトピック