【发布时间】:2014-10-26 17:08:24
【问题描述】:
我正在训练一个一对一的支持向量机分类器。我使用 200 x 459 矩阵来训练使用 VLFeat svm 分类器的分类器。 (http://www.vlfeat.org/matlab/vl_svmtrain.html)
[W B] = vl_svmtrain(train_image_feats', tmp', .00001);
其中train_image_feats' 是一个 200 x 459 矩阵,tmp' 是标签矩阵,它是 1 x 459 向量。
上面的命令可以毫无问题地训练 svm,但是在对测试矩阵上获得的分数进行分类时,我得到了一个错误。测试矩阵的大小显然和训练矩阵的大小不一样。
scores(i, :) = W'*test_image_feats' + B;
test_image_feats' 是一个 200 x 90 矩阵。 scores 是一个 9 x 459 矩阵。 9 因为有 9 个类别(标签)要分类,459 是训练图像的数量。
上面的命令报错:
下标分配维度不匹配。
svm_classify 中的错误(第 56 行) score(i, :) = W'*test_image_feats' + B;
编辑:添加完整代码..
categories = unique(train_labels);
num_categories = length(categories);
scores = zeros([num_categories size(train_labels, 1)]); %train_labels is 459 by 1 size
for i=1:num_categories %there are 9 categories
tmp = strcmp(train_labels, categories{i});
tmp = tmp - (1-tmp);
[W B] = vl_svmtrain(train_image_feats', tmp', .00001);
scores(i, :) = W'*test_image_feats' + B;
end
predicted_categories = cell(size(train_labels));
parfor i=1:size(test_image_feats,1)
image_scores = scores(:, i);
label_index = find(image_scores==max(image_scores));
predicted_categories{i}=categories(label_index);
end
【问题讨论】:
-
在我看来,您正在混合测试和训练用例。我假设在训练模型后,您使用它来预测 90 个测试图像?
-
所以?
sizes 是什么W'和B?size是什么W'*test_image_feats' + B? -
W' 是 1 x 200 矩阵,B 是标量值(偏移值)
-
您能提供更多代码吗?对我来说,“分数”的大小没有任何意义。它应该是什么?您的测试用例的预测分数?在那种情况下,它应该是 9 x 90,而不是 9 x 459。您还说有 9 个标签,但是这 9 个标签是否在“tmp”中一致指定?
-
您尝试预测 90 张图像的分数,并使用一个可以包含 459 个分数的矩阵。 “分数”必须是 9*“测试图像数”。
标签: matlab image-processing classification svm