Main Content

転移学習入門

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

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

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

ワークスペースで、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] を選択し、[開く] をクリックします。

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

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

新しいイメージを分類するように SqueezeNet に再学習させるには、ネットワークの最後の 2 次元畳み込み層 conv10 を編集します。

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

NumFilters プロパティを新しいクラス数 (この例では 5) に設定します。WeightLearnRateFactor および BiasLearnRateFactor10 に設定して学習率を変更し、新しい層での学習速度を転移層より速くします。

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

学習オプションの指定

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

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);

augimdsTrain = augmentedImageDatastore(inputSize,imdsTest);

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) + ")")

転移学習の詳細およびネットワークのパフォーマンスを向上させる方法の詳細については、Retrain Neural Network to Classify New Imagesを参照してください。

参照

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

参考

| | | |

関連するトピック