如何获得在更大矩阵上训练的 SVM 以对不同大小的矩阵进行分类
Posted
技术标签:
【中文标题】如何获得在更大矩阵上训练的 SVM 以对不同大小的矩阵进行分类【英文标题】:How can I get a SVM that has been trained on a bigger matrix to classify a different size matrix 【发布时间】: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, categoriesi);
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_categoriesi=categories(label_index);
end
【问题讨论】:
在我看来,您正在混合测试和训练用例。我假设在训练模型后,您使用它来预测 90 个测试图像? 所以?size
s 是什么 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*“测试图像数”。
【参考方案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)
【讨论】:
谢谢你,这是解决方案。我知道大小不同但没有编辑它,因为 90 小于 459,所以理论上它应该使用 90 列并将其余列保留为 0。我认为当矩阵小于所需数量时会出现问题。但我想这不是它的工作原理。【参考方案2】:问题不在于您分配的右手边,而在于score(i,:)
:您正试图将一个 9×90 大小的矩阵分配到 score
的 单 行中- 这根本不适合。
【讨论】:
显然,错误信息对此非常清楚。但对我来说,从概念的角度来看,这条线没有意义。 在您看来显而易见,它仍然是 OP 所要求的。这个答案解释了错误信息。 "测试矩阵明显和训练矩阵大小不一样。"从OP的问题。这并不是 OP 真正要问的,但无论如何......以上是关于如何获得在更大矩阵上训练的 SVM 以对不同大小的矩阵进行分类的主要内容,如果未能解决你的问题,请参考以下文章