MATLAB Answers

ssk
0

matlabのディー​プラーニングでは、な​ぜテストデータを使わ​ずにバリデーションデ​ータを使うのか

Asked by ssk
on 7 Mar 2019
Latest activity Commented on by ssk
on 17 Mar 2019
プログラミング初心者です。
下記リンクにつきまして、
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7);
という一文がありますが、なぜ、テストデータを使わずにバリデーションデータを使うのでしょうか。
imdsValidationではなく、imdsTestだと納得できるのですが不思議です。
もしバリデーションデータを使うのであれば、テストデータは使わなくてもいいかご教示頂けますと幸いです。

  0 Comments

Sign in to comment.

1 Answer

Answer by Kenta Itakura on 12 Mar 2019
 Accepted Answer

単に、ここではバリデーションデータをテストデータと読み替えて問題ないと思います。また、以下のように、
[imdsTrain,imdsValidation, imdsTest] = splitEachLabel(imds,0.7,0.2);
などとして、画像を訓練、バリデーション、テストデータに分けると良いかもしれません。
リンクの学習曲線のところでは、バリデーションデータを使います。
そして、最後のところで
[YPred,probs] = classify(net,imdsTest);
accuracy = mean(YPred == imdsTest.Labels)
とすると、テストデータで正答率を計算できます。ここで、optionsのところに
'ValidationPatience', 3
を追加すれば学習の早期終了ができます。「'ValidationPatience' の値は、ネットワークの学習が停止するまでに、検証セットでの損失が前の最小損失以上になることが許容される回数です。」
とあります。学習がある程度のところで限界が来たらそこで学習がストップするので学習時間を短縮できたり、過学習が抑えられる可能性があります。

  11 Comments

ssk
on 15 Mar 2019
ニュアンスをご教示いただきありがとうございました!
覚えが悪く大変申し訳なのでもう一度確認しますが、(1,000枚の画像がある場合、)まず900(training), 100(test)に分けて、その後で900を更に800(training)、100(varidation)に分けるということですね。以上から、800(training)、100(test)、100(validation)になるということでしょうか。
上記コードですと、for loop内では以下のようになっておりますので
[imdstrain,imdsvalidation]=splitEachLabel(trainimds,0.8);
imstrain1の場合、
training:900(枚)*0.8= 720(枚)
validation:900(枚)*0.2= 180(枚)
test: 100(枚)・・・imds10
これを順に10回続けていって・・・
imstrain10の場合、
training:900(枚)*0.8= 720(枚)
validation:900(枚)*0.2= 180(枚)
test: 100(枚)・・・imds01
以上の平均を求めるという認識でよろしいでしょうか?
Kenta Itakura on 17 Mar 2019
はい、それで正しいと思います。
ssk
on 17 Mar 2019
ありがとうございます!

Sign in to comment.