転移学習入門
この例では、ディープ ネットワーク デザイナーを使用して転移学習用のネットワークを準備する方法を示します。
転移学習は、深層学習アプリケーションでよく使用されています。事前学習済みのネットワークを取得して、新しいタスクの学習の開始点として使用できます。通常は、転移学習によってネットワークを微調整する方が、ランダムに初期化された重みでゼロからネットワークに学習させるよりもはるかに簡単で時間がかかりません。少ない数の学習イメージを使用して、新しいタスクに学習済みの特徴を高速に転移できます。
イメージ データの読み込み
ワークスペースで、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
および BiasLearnRateFactor
を 10
に設定して学習率を変更し、新しい層での学習速度を転移層より速くします。
ネットワークの学習の準備が整っていることを確認するには、[解析] をクリックします。深層学習ネットワーク アナライザーによってエラーや警告が報告されていないため、ネットワークの学習の準備は整っています。ネットワークをエクスポートするには、[エクスポート] をクリックします。アプリはネットワークを変数 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.
参考
imagePretrainedNetwork
| dlnetwork
| trainingOptions
| trainnet
| ディープ ネットワーク デザイナー