。まだこれに対する解決策を探している人がいるかどうかは不明です。
私は、複数のIMDSを1つに結合する機能を作成しました(あなたの_mergeEachLabel_
の提案に似ています)。
MATLAB documentationによれば、imageDatastore
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
希望します。