MATLAB Answers

ssk
0

交差検定(cross​-validatio​n)につきまして

Asked by ssk
on 28 Feb 2019
Latest activity Edited by ssk
on 16 Sep 2019 at 18:22
プログラミング初心者です。
以下のディレクトリ構造に基づき、cross-validationのコードを自力で書きたいと思っていますが、
数週間考えてもどのように分割していいか分からず質問いたします。
どうぞよろしくお願いいたします。
main
-- a
-- image
 -- b
  -- image
 -- c
  -- image
-- d
  -- image
%path = current directory
currentdirectory = pwd;
categories = {'a', 'b', 'c','d'};
%Create an ImageDatastore to help you manage the data.
imds = imageDatastore(fullfile(currentdirectory, categories),'IncludeSubfolders',true,'FileExtensions','.dcm','LabelSource', 'foldernames','ReadFcn');
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.7,'randomize');
下記コード以降に交差検定を導入するコードを導入するかと思うのですが、現状アイディアが思い浮かびません。

  0 Comments

Sign in to comment.

2 Answers

Answer by Kenta Itakura on 1 Mar 2019
Edited by Kenta Itakura on 1 Mar 2019
 Accepted Answer

[imds01,imds02,imds03,imds04,imds05,imds06,imds07,imds08,imds09,imds010]...
= splitEachLabel(imds,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,'randomize');
imdsTrain1 = imageDatastore(cat(1,imds01.Files,imds02.Files,imds03.Files,imds04.Files,imds05.Files,imds06.Files,imds07.Files,imds08.Files,imds09.Files));
imdsTrain1.Labels = cat(1,imds01.Labels,imds02.Labels,imds03.Labels,imds04.Labels,imds05.Labels,imds06.Labels,imds07.Labels,imds08.Labels,imds09.Labels);
交差検証であれば、crossvalの関数で、任意の分割数で交差検証ができます。その際、実行するコードをfunction化して、
入れ子にすればよいです。
ただ、上のように、かなり無理やりではありますが、全画像を10個に分けたほうがわかりやすいかもしれません。添付のファイルを実行してみてください。
imdsとして、全画像を読み込む
spritEachLabelで10個に分ける
imdsTrain〇として、10個分に分ける
以下for文
for i=1:10
imdsTrain〇(〇にはiの値)で訓練データ
imdsValidation〇(〇には10-iの値、はじめにimdsTrain〇には、imds0〇だけ除外するようにしておく)
通常の流れにそって、imdsTrainで訓練し、imdsValidationでテストする
end
この手書き文字の判別を10点交差検証で行っています。時間がかかるので、maxepochsを1にしています。4にすれば、精度があがるはずです。

  9 Comments

Kenta Itakura on 13 Apr 2019
SSKさん、こんにちは、目標の分類はうまくいきそうですか?
1)imdsTrain1, 2, 3...のように、imdsTrainに数字(添え字)をくっつけたかったので、整数の%dを付けました。これだと、任意の整数を特に考えることもなく、くっつけることができるのでそうしています。
2)これも同じで、imdsTrain1,..., imdsTrain5のような変数を作りたかったのでこうしています。
3)accuracyを出すコマンドの最後に 「;」 がついていませんか?
ssk
on 13 Apr 2019
Itakuraさま、ご回答ありがとうございます。おかげさまで分類自体はうまくいっておりますが、コードの指す意味につきまして少しあいまいなところがございましたのでご連絡いたしました。深く理解できました。ありがとうございました!
ssk
on 16 Apr 2019
itakura様、度々のご連絡大変失礼いたします。
eval関数につきまして、eval(['trainimds' ,'=', stname,';'])となっておりますが、ここでなぜ '='としているのかご教示いただけますでしょうか。 trainimdsをtrainimds1.....trainimds10と出力するのに'='は必ず必要ないと考えましたのですが。。

Sign in to comment.


Answer by Kenta Itakura on 16 Apr 2019

trainimds=stname;
とすることを意図しています。ただ、evalはいらないような気もします。
今回はtrainimdsという名前の変数にtrainimds1, ...を与えるので=が必要です。
b=10という変数があって、a=b;とするのと同様です。

  1 Comment

ssk
on 16 Apr 2019
=が必要とのこと、深く理解できました。ありがとうございました!

Sign in to comment.