如何获得已在较大矩阵上训练的SVM,以对不同大小的矩阵进行分类

时间:2014-09-02 12:20:04

标签: matlab image-processing classification svm

我正在训练一个vs所有svm分类器。我使用200乘459矩阵来训练使用VLFeat svm分类器的分类器。 (http://www.vlfeat.org/matlab/vl_svmtrain.html

[W B] = vl_svmtrain(train_image_feats', tmp', .00001);

其中train_image_feats'是200乘459矩阵,tmp'是1乘459矢量的标签矩阵。

上面的命令训练svm没有问题,但是然后对在测试矩阵上获得的分数进行分类我得到了一个错误。测试矩阵显然与训练矩阵的大小不同。

   scores(i, :) = W'*test_image_feats' + B;

test_image_feats'是200乘90的矩阵。 scores是9乘459矩阵。 9因为有9个类别(标签)要分类,459个是训练图像的数量。

上面的命令给出错误:

  

订阅的分配维度不匹配。

     

svm_classify(第56行)得分(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

2 个答案:

答案 0 :(得分:1)

问题不在于作业的右侧,而在于score(i,:):您正试图将9 x 90尺寸的矩阵分配到{strong>单行{ {1}} - 这根本不合适。

答案 1 :(得分:1)

从概念上讲,您正在训练一个包含459个训练样本的模型,以预测90个测试样本的分数。

scores = zeros([num_categories size(train_labels, 1)]);

不对,因为它将是训练集的大小。事实上,您根本不必关心训练集的大小,您可以使用20或20000个图像训练模型,预测步骤不应该有任何不同。

scores必须考虑到测试用例

scores = zeros([num_categories size(test_labels, 1)]);

当你使用459时它只能工作,因为size(test_labels, 1)等于size(train_labels, 1)