Medical Image Classifica​tionにおけるcr​oss-valida​tionの使い方につ​きまして

プログラミング初心者です。
以下のディレクトリ構造に基づき、cross-validationのコードを書きたいと思っていますが、
helpを見てもつまづいてしまいましてご質問いたします。
cross-validationは10-foldを希望しております。
どうぞよろしくお願いいたします。
main
-- a
-- image.dcm(10 dicom file)
 -- b
  -- image.dcm(10 dicom file)
 -- c
  -- image.dcm(10 dicom file)
-- d
  -- image.dcm(10 dicom file)
%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',@dicomread);
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.5,'randomize');
おそらく下記コードをcross-validationに変更するかと思うのですが、うまくできません。。
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.5,'randomize');

 Accepted Answer

ryota suzuki
ryota suzuki on 13 Feb 2019
Edited: ryota suzuki on 13 Feb 2019
[imdsTrain,imdsValidation] = splitEachLabel(imds,0.5,'randomize');
では変数imdsに集約されたデータのうち,50% をimdsTrainに,残りの50% をimdsValidationにランダムに分割させています.
変数名から考えるに,imdsTrainは学習用,imdsValidationは検証用のデータではないでしょうか.
機械学習において,交差検証(Cross-validation)とは,学習前に検証用のデータ(Validation Data)を抜きとり,
学習とは独立させることで過学習を防ぐ取り組みです.
学習用データ(Training Data)を使って変数の最適化計算を行い,その結果を用いて検証用データで何度もテストを行います.
現状のスクリプトは,データを読み取り,学習用と検証用に分けたところまでであり,
交差検証には進んでいません.
このあとに学習させるコマンドを追加させる必要があります.
10-foldという単語を見るに,K-fold Cross Validationを検討中でしょうか.
Statistics and Machine Learning Toolboxを導入すれば,一発でできそうな分割コマンドがありましたが(データの交差検証分割を作成),splitEachLabelでも可能かと思います.
[imds01,imds02,imds03,imds04,imds05,imds06,imds07,imds08,imds09,imds10]...
= splitEachLabel(imds,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,0.1,'randomize');
でデータを10分割し,適宜,
imdsTrain = imageDatastore(cat(1,imds01.Files,imds02.Files, ... ,imds09.Files))
imdsValidation = imds10
という具合に結合させて学習にまわす動作を,組み合わせを変えながら10回繰り返すことでできるかと思います.

6 Comments

ご回答ありがとうございます。大変参考になりました。一転申しそびれていたことがございまして、現在は各10枚ですが、今後写真の数を増やして数千枚で実施する予定です。
この場合、頂いた方法では時間がかかりすぎてしまうかと思いますが何かよろしい方法がございましたらご教示いただけますと幸いです。
K-fold Cross ValidationはK回推定を行う都合上どうしても時間がかかってしまうかと思います.
そもそも機械学習は大変に計算時間のかかる分野であり,PCの性能が要求されます.
学習については畳み込みニューラルネットワーク(CNN)を検討中でしょうか?
CNNの場合なら,転移学習という手段を用いれば計算負荷が少なくすることは可能です.
まぁ,CNNについてはよっぽど性能のいいマシンでない限り転移学習でモデルを作るのが主流ですが.
転移学習のやり方についてはMathWorks公式のドキュメンテーションがあります(AlexNet を使用した転移学習).
ただしDeep Learning Toolboxが必要です.
ssk
ssk on 13 Feb 2019
Edited: ssk on 13 Feb 2019
ご回答ありがとうございます。K-foldでは時間がかかるのですね。。おっしゃるとおりCNNを検討しているので転移学習に取り組んでみようと思います。
一点ご確認ですが、7-foldの場合は
[imds01,imds02,imds03,imds04,imds05,imds06,imds07]...
= splitEachLabel(imds,0.1,0.1,0.1,0.1,0.1,0.1.0,'randomize');
imdsTrain = imageDatastore(cat(1,imds01.Files,imds02.Files, ... ,imds06.Files))
imdsValidation = imds7
どうぞよろしくお願いいたします。
五月雨式のコメント失礼いたします。cvpartitionコマンドを使って、10個のデータを10-foldで分割した場合、式は以下の通りとなると思いますが
c = cvpartition(10,'KFold',10);
こちらを結合させる場合、どのような処理となるかご教示頂けますでしょうか?
Statistics and Machine Learning Toolboxについては私は触ったことがないので結合の仕方はわからないです.自分の環境下で試せないので確かなことは言えないです.申し訳ありません.
ただ,cvpartitionのドキュメンテーションページにはK-foldの計算例が記載されているようです.
何度もご質問してしまいご迷惑おかけしました。ここから先は自身で解決します。ご示唆を頂きまして本当にありがとうございました。

Sign in to comment.

More Answers (0)

Categories

Find more on Deep Learning Toolbox in Help Center and File Exchange

Asked:

ssk
on 11 Feb 2019

Commented:

ssk
on 14 Feb 2019

Community Treasure Hunt

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

Start Hunting!