如何获得在更大矩阵上训练的 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 个测试图像? 所以? sizes 是什么 W'Bsize 是什么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 以对不同大小的矩阵进行分类的主要内容,如果未能解决你的问题,请参考以下文章

SVM 每行训练矩阵的长度

实时 SVM 性能差

决策树完整性和未分类数据

如何使用新数据更新 SVM 模型

使用可变大小的训练图像 hog 描述符训练 SVM (MATLAB)

如何标记 PCA 获得的训练投影以用于训练 SVM 进行分类? MATLAB