メインコンテンツ

転移学習入門

この例では、ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを準備する方法を示します。

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

イメージ データの読み込み

ワークスペースで、MathWorks® Merch データ セットを解凍します。このデータにアクセスするには、例をライブ スクリプトとして開きます。この小さなデータ セットには、75 個の MathWorks の商品イメージが格納されており、イメージは 5 つの異なるクラス (cap、cube、playing cards、screwdriver、torch) に属しています。

folderName = "MerchData";
unzip("MerchData.zip",folderName);

イメージ データストアを作成します。イメージ データストアを使用すると、イメージ データの大規模なコレクション (メモリに収まらないデータなど) を格納し、ニューラル ネットワークの学習中にイメージをバッチ単位で効率的に読み取ることができます。抽出したイメージがあるフォルダーを指定し、サブフォルダー名がイメージ ラベルに対応していることを示します。

imds = imageDatastore(folderName, ...
    IncludeSubfolders=true, ...
    LabelSource="foldernames");

いくつかのサンプル イメージを表示します。

numImages = numel(imds.Labels);
idx = randperm(numImages,16);
I = imtile(imds,Frames=idx);
figure
imshow(I)

クラス名とクラス数を抽出します。

classNames = categories(imds.Labels);
numClasses = numel(classNames);

データを学習データ セット、検証データ セット、テスト データ セットに分割します。イメージの 70% は学習に使用し、15% は検証に使用し、15% はテストに使用します。関数 splitEachLabel は、イメージ データストアを 3 つの新しいデータストアに分割します。

[imdsTrain,imdsValidation,imdsTest] = splitEachLabel(imds,0.7,0.15,0.15,"randomized");

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

事前学習済みのニューラル ネットワークを新しいタスクに適応させるには、ディープ ネットワーク デザイナー アプリを使用します。

deepNetworkDesigner

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

The Deep Network Designer start page, showing the mouse hovering over Squeezenet which displays proprties of the model, including its depth (18), parameter memory (4.7 MB), number of parameters (1.24 M), and input size (227-by-227-by-3).

転移学習用にネットワークを編集するには、次のようにします。

  • [クラス数] を新しいクラス数 (この例では 5) に設定します。

  • [最後の学習可能な層における学習率]10 に設定して、最後の学習可能な層での学習速度を転移層より速くします。

  • [インポート] をクリックします。

Customize pretrained network dialog showing the number of classes set to 5 and the learning rate in the last layer set to 10.

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

The designer pane in deep network designer, showing the layers in squeezenet.

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

Network Analyzer pane showing that there are no errors or warnings.

ネットワークをエクスポートするには、[エクスポート] をクリックしてから [OK] をクリックします。アプリはネットワークを変数 net_1 に保存します。

Dialog with a text field to name the exported network.

学習オプションの指定

学習オプションを指定します。オプションの中から選択するには、経験的解析が必要です。実験を実行してさまざまな学習オプションの構成を調べるには、実験マネージャーアプリを使用できます。

options = trainingOptions("adam", ...
    ValidationData=imdsValidation, ...
    ValidationFrequency=5, ...
    Plots="training-progress", ...
    Metrics="accuracy", ...
    Verbose=false);

ニューラル ネットワークの学習

関数trainnetを使用してニューラル ネットワークに学習させます。分類が目的なので、クロスエントロピー損失を使用します。

net = trainnet(imdsTrain,net_1,"crossentropy",options);

ニューラル ネットワークのテスト

テスト イメージを分類します。複数の観測値を使用して予測を行うには、関数minibatchpredictを使用します。予測スコアをラベルに変換するには、関数scores2labelを使用します。関数 minibatchpredict は利用可能な GPU がある場合に自動的にそれを使用します。

inputSize = net.Layers(1).InputSize(1:2);

YTest = minibatchpredict(net,imdsTest);
YTest = scores2label(YTest,classNames);

混同チャートで分類精度を可視化します。

TTest = imdsTest.Labels;
figure
confusionchart(TTest,YTest);

新しいイメージの分類

テスト イメージを分類します。JPEG ファイルからイメージを読み取り、サイズを変更し、single データ型に変換します。

im = imread("MerchDataTest.jpg");

im = imresize(im,inputSize(1:2));
X = single(im);

イメージを分類します。単一の観測値を使用して予測を行うには、関数predictを使用します。

scores = predict(net,X);
[label,score] = scores2label(scores,classNames);

予測されたラベルと対応するスコアを含むイメージを表示します。

figure
imshow(im)
title(string(label) + " (Score: " + gather(score) + ")")

転移学習の詳細およびネットワークのパフォーマンスを向上させる方法の詳細については、新しいイメージを分類するためのニューラル ネットワークの再学習を参照してください。

参照

[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.

参考

| | | |

トピック