2017-02-10 10 views
0

imageDatastoreオブジェクトのsplitEachLabelメソッドは、画像データストアをカテゴリラベルごとに分割します。クロスバリデーションを使用し、trainImageCategoryCalssifierクラスを使用してトレーニングのために画像データストアを分割するにはどうすればよいですか?MATLABで相互検証のためにイメージデータストアを分割する方法は?

I.e.それをN個のパーティションに分割するのは簡単ですが、クロスバリデーションを使用してクラシファイアをトレーニングできるようにするには、ある種の_mergeEachLabel_機能が必要です。

これを達成する別の方法がありますか?

よろしく、私は最近、同じ問題につまずい エレナ

答えて

0

。まだこれに対する解決策を探している人がいるかどうかは不明です。

私は、複数のIMDSを1つに結合する機能を作成しました(あなたの_mergeEachLabel_の提案に似ています)。

MATLAB documentationによれば、imageDatastore 4つのフィールド

  1. 画像へのパス
  2. 各画像
  3. のラベルを持つセルアレイとセルアレイ数を指定する整数を有する構造であります読者の各呼び出しで読み取る画像の数
  4. 画像データを読み取る関数

この機能は、N個の異なるIMDSの第1フィールドと第2フィールドをこの新しいIMDSに連結する新しいIMDSを作成するだけです。

次に、この機能を使用して相互検証を実行することができます。あなたは5つの折り畳み(5つの異なるIMDS)を持っている場合、trainImageCategoryClassifierを呼び出すループを実行することができ、それは4つの折り畳みをトレーニングセットに結合し、残りのIMDSでevaluateを実行します。

警告:これを使用した後、この方法で作業することは非常に効率が悪いことに気付きました。これは、CVループの繰り返しごとに画像をあなたのバッグに再エンコードするためです。 。彼らは内蔵のCVの機能を持っているところそれは、X行列に一度あなたの全体のIMDSをエンコードして、直接fitsvmを使用する方が効率的である

とにかく、誰もが、まだこの問題に関心がある場合、ここで私の関数である。

function [newimds] = combineimds(cell_imds) 
% COMBINEIMDS Merges a set of IMDS together and returns the combined IMDS 
%  CELL_IMDS is a 1xn cell array where each cell is a different IMDS object 
%% 
n = size(cell_imds, 2);  % assumes that cell_imds is 1xn 

%% 
% use function splitEachLabel to copy first fold to new imds 
[newimds dummy] = splitEachLabel(cell_imds{1}, 1); 
a = [newimds.Files; dummy.Files]; 
b = [newimds.Labels; dummy.Labels]; 
newimds.Files = a; 
newimds.Labels = b; 
%% 
% concatenate cells in the new imds 
for i = 2:n 
    a = [newimds.Files; cell_imds{i}.Files]; 
    b = [newimds.Labels; cell_imds{i}.Labels]; 
    newimds.Files = a; 
    newimds.Labels = b; 
end 

end 

希望します。

関連する問題