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

転移学習入門

この例では、転移学習を使用して、事前学習済みの畳み込みニューラル ネットワークである ResNet-18 の再学習を行い、新しい一連のイメージを分類する方法を説明します。この例を試して、MATLAB® でどれほど簡単に深層学習を始めることができるか確認してください。

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

データの読み込み

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

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

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

事前学習済みの ResNet-18 ネットワークを読み込みます。Deep Learning Toolbox™ Model for ResNet-18 Network がインストールされていない場合、ダウンロード用リンクが表示されます。ResNet-18 は、100 万枚を超えるイメージで学習しており、イメージを 1000 個のオブジェクト カテゴリ (キーボード、マグ カップ、鉛筆、多くの動物など) に分類できます。このネットワークは広範囲にわたるイメージについての豊富な特徴表現を学習しています。このネットワークは入力としてイメージを取り、イメージ内のオブジェクトのラベルを各オブジェクト カテゴリの確率と共に出力します。さまざまな事前学習済みのネットワークを使用して転移学習を実行するには、新しいイメージを分類するための深層学習ネットワークの学習を参照してください。

net = resnet18;

最後の層の置き換え

新しいイメージを分類するように ResNet-18 に再学習させるには、ネットワークの最後の全結合層と最終分類層を置き換えます。ResNet-18 では、これらの層の名前はそれぞれ 'fc1000''ClassificationLayer_predictions' です。新しい全結合層のサイズが新しいデータセットのクラスの数 (この例では 5) と同じになるように設定します。新しい層での学習速度を転移された層より速くするには、全結合層の学習率係数を大きくします。

numClasses = numel(categories(imdsTrain.Labels));
lgraph = layerGraph(net);

newFCLayer = fullyConnectedLayer(numClasses,'Name','new_fc','WeightLearnRateFactor',10,'BiasLearnRateFactor',10);
lgraph = replaceLayer(lgraph,'fc1000',newFCLayer);

newClassLayer = classificationLayer('Name','new_classoutput');
lgraph = replaceLayer(lgraph,'ClassificationLayer_predictions',newClassLayer);

ネットワークの学習

ネットワークにはサイズが 224 x 224 x 3 の入力イメージが必要ですが、イメージ データストアにあるイメージのサイズは異なります。拡張イメージ データストアを使用して学習イメージのサイズを自動的に変更します。imageDataAugmenter を使用して学習イメージに対して実行する追加の拡張演算を指定し、ネットワークの過適合を防止することもできます。

inputSize = net.Layers(1).InputSize;
augimdsTrain = augmentedImageDatastore(inputSize(1:2),imdsTrain);
augimdsValidation = augmentedImageDatastore(inputSize(1:2),imdsValidation);

ミニバッチのサイズ、検証データなどの学習オプションを指定します。InitialLearnRate を小さい値に設定して、転移層での学習速度を下げます。上記の手順では、全結合層の学習率係数を大きくして、新しい最後の層での学習時間を短縮しています。この学習率設定の組み合わせによって、新しい層でのみ学習が急速に進み、他の層での学習速度は低下します。

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

学習データを使用してネットワークに学習させます。既定では、利用可能な GPU がある場合、trainNetwork は GPU を使用します (Parallel Computing Toolbox™、および Compute Capability 3.0 以上の CUDA® 対応 GPU が必要)。そうでない場合は CPU が使用されます。

trainedNet = trainNetwork(augimdsTrain,lgraph,options);

検証イメージの分類

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

YPred = classify(trainedNet,augimdsValidation);
accuracy = mean(YPred == imdsValidation.Labels)
accuracy = 1

詳細

さまざまな事前学習済みのネットワークを使用して転移学習を実行するには、新しいイメージを分類するための深層学習ネットワークの学習を参照してください。ディープ ネットワーク デザイナー アプリを使用して転移学習を試すには、ディープ ネットワーク デザイナーを使用した転移学習を参照してください。事前学習済みのネットワークの一覧と比較については、事前学習済みの深層ニューラル ネットワークを参照してください。

参照

[1] Krizhevsky, Alex, Ilya Sutskever, and Geoffrey E. Hinton. "ImageNet Classification with Deep Convolutional Neural Networks." Advances in neural information processing systems. 2012.

[2] BVLC AlexNet Model. https://github.com/BVLC/caffe/tree/master/models/bvlc_alexnet

参考

| |

関連するトピック