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

10 ビュー (過去 30 日間)
Jo Sasaki
Jo Sasaki 2019 年 8 月 20 日
回答済み: Kenta 2019 年 8 月 20 日
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 件のコメント
Kenta
Kenta 2019 年 8 月 20 日
ここに同様の質問がありました。ほかにも類似した質問がありました。比較的起こりやすい現象のようです。さきほどの早期終了はあまり良い解決策ではないかもしれません。
ここにチェックポイントのことが書いていています。各エポックごとに学習器を保存して、最終エポックの手前の学習器を利用したらよいのではないかとも思いましたが、上にある通り、batchnormalizationやdropoutに原因があれば、こちらもあまり効果はないかもしれません。
手始めに、dropout層を削除するか、最後のみにしてみてはどうでしょうか。dropout層は最後に置くだけでも良い気がします。
Jo Sasaki
Jo Sasaki 2019 年 8 月 20 日
思い切って正規化層を完全に省いたレイヤーで学習を行ったところ問題が解決しました。
ありがとうございました。
%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

サインインしてコメントする。

採用された回答

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

その他の回答 (0 件)

カテゴリ

Help Center および File Exchangeイメージを使用した深層学習 についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!