我正在训练一个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
答案 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)