交差検定(cross-validation)につきまして
이 질문을 팔로우합니다.
- 팔로우하는 게시물 피드에서 업데이트를 확인할 수 있습니다.
- 정보 수신 기본 설정에 따라 이메일을 받을 수 있습니다.
오류 발생
페이지가 변경되었기 때문에 동작을 완료할 수 없습니다. 업데이트된 상태를 보려면 페이지를 다시 불러오십시오.
이전 댓글 표시
0 개 추천
プログラミング初心者です。
以下のディレクトリ構造に基づき、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');
下記コード以降に交差検定を導入するコードを導入するかと思うのですが、現状アイディアが思い浮かびません。
채택된 답변
2 개 추천
[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
全画像を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
2019년 3월 12일
すいません、コメントをくださったのに気付いてませんでした。
(1)すいません、特に意味ないです。削除してください。
(2)これもほとんど意味ありません。ループの途中で毎回、変数accuracyの大きさが変わってしまうので、さきに指定するように自動で推奨されたのでそうしてます。ただ、これくらいの大きさなら特に変わりはないかと思います。
(3)はい、そうです
(4)この場合これで正しく変数を指定できるので問題ありません。あとでその変数を参照したいときはstname2としたほうがいいと思います。
(5)平均はしていません。mean(accuracy)の値を代表値としてください。
ssk
2019년 3월 12일
早速のコメントありがとうございます。このうち、(5)ですべての値の平均値を求めずに代表値を使う理由につきましてご教示いただけますでしょうか。
Kenta
2019년 3월 12일
mean(accuracy)がaccuracyの平均という意味です。失礼いたしました。
ssk
2019년 3월 12일
ありがとうございます。深く理解できました!
Itakuraさま、平素より大変お世話になっております。先日頂いたコードにつきましていくつかお伺いしたいことがございまして再度ご連絡いたしました
ご多忙のところ恐れ入りますがどうぞよろしくお願いいたします。
(1)%dの用例につきまして
stname1=sprintf('imdsTrain%d',i);
という一文で%dを使っていて、%dはdecimal(10進法)を表すかと思いますが、なぜこの%dを使ったのかご教示いただけますでしょうか
(2)sprintf関数の用法につきまして
ここで使われているsprintfはimdsTrain1,imdsTrain2・・・といったように10進数として文字列を生成するという認識でよろしいでしょうか。
Kenta
2019년 4월 13일
SSKさん、こんにちは、目標の分類はうまくいきそうですか?
1)imdsTrain1, 2, 3...のように、imdsTrainに数字(添え字)をくっつけたかったので、整数の%dを付けました。これだと、任意の整数を特に考えることもなく、くっつけることができるのでそうしています。
2)これも同じで、imdsTrain1,..., imdsTrain5のような変数を作りたかったのでこうしています。
3)accuracyを出すコマンドの最後に 「;」 がついていませんか?
ssk
2019년 4월 13일
Itakuraさま、ご回答ありがとうございます。おかげさまで分類自体はうまくいっておりますが、コードの指す意味につきまして少しあいまいなところがございましたのでご連絡いたしました。深く理解できました。ありがとうございました!
ssk
2019년 4월 16일
itakura様、度々のご連絡大変失礼いたします。
eval関数につきまして、eval(['trainimds' ,'=', stname,';'])となっておりますが、ここでなぜ '='としているのかご教示いただけますでしょうか。 trainimdsをtrainimds1.....trainimds10と出力するのに'='は必ず必要ないと考えましたのですが。。
Kenta
2020년 1월 24일
trainimds=stname;
とすることを意図しています。ただ、evalはいらないような気もします。
今回はtrainimdsという名前の変数にtrainimds1, ...を与えるので=が必要です。
b=10という変数があって、a=b;とするのと同様です。
추가 답변 (0개)
카테고리
도움말 센터 및 File Exchange에서 変数에 대해 자세히 알아보기
참고 항목
웹사이트 선택
번역된 콘텐츠를 보고 지역별 이벤트와 혜택을 살펴보려면 웹사이트를 선택하십시오. 현재 계신 지역에 따라 다음 웹사이트를 권장합니다:
또한 다음 목록에서 웹사이트를 선택하실 수도 있습니다.
사이트 성능 최적화 방법
최고의 사이트 성능을 위해 중국 사이트(중국어 또는 영어)를 선택하십시오. 현재 계신 지역에서는 다른 국가의 MathWorks 사이트 방문이 최적화되지 않았습니다.
미주
- América Latina (Español)
- Canada (English)
- United States (English)
유럽
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)