MATLAB Answers

0

cnn学習データにおける最終検証精度について

Asked by Jo Sasaki on 20 Aug 2019
Latest activity Answered by Kenta Itakura on 20 Aug 2019
cnn学習において最終エポックに達した際に検証精度が下がる現象に困っています。
いろいろパラメータを変えたり、学習データと検証データの比率を変えるなどしましたが直接的な原因がわかりません。
こういった現象の対策法等ございますでしょうか?
layers=[
imageInputLayer([1 1501]);
%layer1
convolution2dLayer([1 256],30,'stride',1);
batchNormalizationLayer
reluLayer();
dropoutLayer
maxPooling2dLayer([1 3],'stride',1);
%layer2
convolution2dLayer([1 64],30,'stride',1);
batchNormalizationLayer
reluLayer();
dropoutLayer
maxPooling2dLayer([1 3],'stride',1);
%layer3
convolution2dLayer([1 64],30,'stride',1);
batchNormalizationLayer
reluLayer();
dropoutLayer
maxPooling2dLayer([1 3],'stride',1);
%layer4
convolution2dLayer([1 32],50,'stride',1);
batchNormalizationLayer
reluLayer();
dropoutLayer
maxPooling2dLayer([1 3],'stride',1);
%layer5
convolution2dLayer([1 25],50,'stride',1);
batchNormalizationLayer
reluLayer();
dropoutLayer
maxPooling2dLayer([1 3],'stride',1);
fullyConnectedLayer(100);
dropoutLayer
fullyConnectedLayer(50);
fullyConnectedLayer(4);
softmaxLayer();
classificationLayer();
];
%データ読み込み
wavedata = imageDatastore('学習データ','Readfcn',@fftreadDatastorezeroCSV,'IncludeSubfolders',true,'LabelSource','foldernames','FileExtensions','.csv');
%ラベルつける
drilllabel = wavedata.Labels;
%検証データ指定
drillvalidation = imageDatastore('検証データ','Readfcn',@fftreadDatastorezeroCSV,'IncludeSubfolders',true,'LabelSource','foldernames','FileExtensions','.csv');
drilllabel = drillvalidation.Labels;
% %訓練、テストデータ分割
[drilltrain,drilltest] = splitEachLabel(wavedata,0.94444,'randomized');
%学習の設定
options = trainingOptions('adam','ExecutionEnvironment','multi-gpu','LearnRateSchedule','piecewise','LearnRateDropPeriod',10,'LearnRateDropFactor',0.5,'MaxEpochs',70,'MiniBatchSize',512, 'ValidationData',drillvalidation,'ValidationPatience',inf,'VerboseFrequency',50,'Plots','training-progress');
%学習の実行
tic
[drillnet,info] = trainNetwork(drilltrain, layers, options);
%drillnetが学習モデルとして格納
toc
スクリーンショット (527).png

  6 Comments

Jo Sasaki on 20 Aug 2019
そのパラメータは触っていないので試してみますね。
ただ手動で早めのエポックで停止した際にもこの現象が見られます。
Kenta Itakura on 20 Aug 2019
ここに同様の質問がありました。ほかにも類似した質問がありました。比較的起こりやすい現象のようです。さきほどの早期終了はあまり良い解決策ではないかもしれません。
ここにチェックポイントのことが書いていています。各エポックごとに学習器を保存して、最終エポックの手前の学習器を利用したらよいのではないかとも思いましたが、上にある通り、batchnormalizationやdropoutに原因があれば、こちらもあまり効果はないかもしれません。
手始めに、dropout層を削除するか、最後のみにしてみてはどうでしょうか。dropout層は最後に置くだけでも良い気がします。
Jo Sasaki on 20 Aug 2019
思い切って正規化層を完全に省いたレイヤーで学習を行ったところ問題が解決しました。
ありがとうございました。
%newlayer2 without batchnormalization and dropout
layers=[
imageInputLayer([1 1501 1]);
%layer1
convolution2dLayer([1 256],100,'stride',2);
% batchNormalizationLayer
reluLayer();
% dropoutLayer
maxPooling2dLayer([1 9],'stride',2);
%layer2
convolution2dLayer([1 128],100,'stride',1);
% batchNormalizationLayer
reluLayer();
% dropoutLayer
maxPooling2dLayer([1 9],'stride',2);
fullyConnectedLayer(500);
% dropoutLayer
fullyConnectedLayer(250);
fullyConnectedLayer(4);
softmaxLayer();
classificationLayer();
];
スクリーンショット (528).png

Sign in to comment.

1 Answer

Answer by Kenta Itakura on 20 Aug 2019
 Accepted Answer

はい、解決してよかったです。このような、最終の検証でのジャンプに対しては、バッチ正則化層やドロップアウト層を除けば解決することが多いようですね。
最終の検証は検証データ全体に対する推定精度で、学習曲線のプロットはバッチごとの検証のようで、その差がこのジャンプを生んでいたのかもしれません。

  0 Comments

Sign in to comment.