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

プログラミング初心者です。
以下のディレクトリ構造に基づき、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');
下記コード以降に交差検定を導入するコードを導入するかと思うのですが、現状アイディアが思い浮かびません。

 Akzeptierte Antwort

Kenta
Kenta am 1 Mär. 2019
Bearbeitet: Kenta am 1 Mär. 2019

2 Stimmen

[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にすれば、精度があがるはずです。

10 Kommentare

ssk
ssk am 1 Mär. 2019
Bearbeitet: ssk am 7 Mär. 2019
全画像を10個で分けるという方法をご教示頂きましてありがとうございます。こちらを導入したところ動きました。大変ありがとうございました。
また頂いたコードにつきまして、いくつかご質問がございまして以下に記します。
(1)コード中のac = 1; は何を指すのでしょうか?(変数の定義でしょうか?)
(2)accuracy=zeros(1,5);につきましてもなぜここでゼロの配列を作る必要があるのでしょうか。
(3)あわせて、eval関数の指す意味につきましてもご教示いただけますと幸いです。どうぞよろしくお願いいたします。
eval(['trainimds' ,'=', stname,';'])の場合、trainimds1,trainimds2.....trainimds10と出力される認識でよろしいでしょうか?
(4)加えて、以下のstnameにつきまして同一の変数を使用しておりますが、
stname=sprintf('imdsTrain%d',i); stname=sprintf('imds0%d',i2);
stname1,stname2と変更する必要はございますか?
(5)私の理解では10分割検証の場合、サンプルを10個に分割し、一つをtest、残る9個をtrainとして、10個に分割されたサンプルそれぞれをテスト事例として10回検証を行い、えられた10回の結果を平均して1つの推定を得るかと思うのですが、コード中で平均はなされておりますでしょうか?
Kenta
Kenta am 12 Mär. 2019
すいません、コメントをくださったのに気付いてませんでした。
(1)すいません、特に意味ないです。削除してください。
(2)これもほとんど意味ありません。ループの途中で毎回、変数accuracyの大きさが変わってしまうので、さきに指定するように自動で推奨されたのでそうしてます。ただ、これくらいの大きさなら特に変わりはないかと思います。
(3)はい、そうです
(4)この場合これで正しく変数を指定できるので問題ありません。あとでその変数を参照したいときはstname2としたほうがいいと思います。
(5)平均はしていません。mean(accuracy)の値を代表値としてください。
ssk
ssk am 12 Mär. 2019
早速のコメントありがとうございます。このうち、(5)ですべての値の平均値を求めずに代表値を使う理由につきましてご教示いただけますでしょうか。
Kenta
Kenta am 12 Mär. 2019
mean(accuracy)がaccuracyの平均という意味です。失礼いたしました。
ssk
ssk am 12 Mär. 2019
ありがとうございます。深く理解できました!
ssk
ssk am 12 Apr. 2019
Bearbeitet: ssk am 12 Apr. 2019
Itakuraさま、平素より大変お世話になっております。先日頂いたコードにつきましていくつかお伺いしたいことがございまして再度ご連絡いたしました
ご多忙のところ恐れ入りますがどうぞよろしくお願いいたします。
(1)%dの用例につきまして
stname1=sprintf('imdsTrain%d',i);
という一文で%dを使っていて、%dはdecimal(10進法)を表すかと思いますが、なぜこの%dを使ったのかご教示いただけますでしょうか
(2)sprintf関数の用法につきまして
ここで使われているsprintfはimdsTrain1,imdsTrain2・・・といったように10進数として文字列を生成するという認識でよろしいでしょうか。
Kenta
Kenta am 13 Apr. 2019
SSKさん、こんにちは、目標の分類はうまくいきそうですか?
1)imdsTrain1, 2, 3...のように、imdsTrainに数字(添え字)をくっつけたかったので、整数の%dを付けました。これだと、任意の整数を特に考えることもなく、くっつけることができるのでそうしています。
2)これも同じで、imdsTrain1,..., imdsTrain5のような変数を作りたかったのでこうしています。
3)accuracyを出すコマンドの最後に 「;」 がついていませんか?
ssk
ssk am 13 Apr. 2019
Itakuraさま、ご回答ありがとうございます。おかげさまで分類自体はうまくいっておりますが、コードの指す意味につきまして少しあいまいなところがございましたのでご連絡いたしました。深く理解できました。ありがとうございました!
ssk
ssk am 16 Apr. 2019
itakura様、度々のご連絡大変失礼いたします。
eval関数につきまして、eval(['trainimds' ,'=', stname,';'])となっておりますが、ここでなぜ '='としているのかご教示いただけますでしょうか。 trainimdsをtrainimds1.....trainimds10と出力するのに'='は必ず必要ないと考えましたのですが。。
Kenta
Kenta am 24 Jan. 2020
trainimds=stname;
とすることを意図しています。ただ、evalはいらないような気もします。
今回はtrainimdsという名前の変数にtrainimds1, ...を与えるので=が必要です。
b=10という変数があって、a=b;とするのと同様です。

Melden Sie sich an, um zu kommentieren.

Weitere Antworten (0)

Kategorien

Gefragt:

ssk
am 28 Feb. 2019

Kommentiert:

am 24 Jan. 2020

Community Treasure Hunt

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

Start Hunting!