Matlab 我怎样才能得到一个在更大的矩阵上训练过的SVM来对不同大小的矩阵进行分类
我正在训练一个一对所有svm分类器。我使用200 x 459的矩阵来训练使用VLFeat svm分类器的分类器。() 其中,Matlab 我怎样才能得到一个在更大的矩阵上训练过的SVM来对不同大小的矩阵进行分类,matlab,image-processing,classification,svm,Matlab,Image Processing,Classification,Svm,我正在训练一个一对所有svm分类器。我使用200 x 459的矩阵来训练使用VLFeat svm分类器的分类器。() 其中,train\u image\u feats'是一个200×459的矩阵,tmp'是一个1×459向量的标签矩阵 上面的命令训练svm没有问题,但是为了对测试矩阵上获得的分数进行分类,我得到了一个错误。测试矩阵显然与训练矩阵的大小不同 scores(i, :) = W'*test_image_feats' + B; 其中,test\u image\u feats'是一
train\u image\u feats'
是一个200×459的矩阵,tmp'
是一个1×459向量的标签矩阵
上面的命令训练svm没有问题,但是为了对测试矩阵上获得的分数进行分类,我得到了一个错误。测试矩阵显然与训练矩阵的大小不同
scores(i, :) = W'*test_image_feats' + B;
其中,test\u image\u feats'
是一个200 x 90的矩阵<代码>分数是一个9乘459的矩阵。9,因为有9个类别(标签)要分类,459是训练图像的数量
上面的命令给出了错误:
下标赋值维度不匹配
svm_分类(第56行)得分错误(i,:)=W'*测试_图像_专长'
+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
问题不在于你的作业右侧,而在于
分数(i,:)
:你试图将一个9×90大小的矩阵分配到一行分数
-这根本不合适。从概念上讲,你是在用459个训练样本训练一个模型,以预测90个测试样本的分数
scores = zeros([num_categories size(train_labels, 1)]);
这是不对的,因为它将是训练集的大小。事实上,你根本不必关心训练集的大小,你可以用20或20000张图像训练模型,预测步骤应该不会有任何不同
分数的定义必须考虑测试用例
scores = zeros([num_categories size(test_labels, 1)]);
当您将459用于两者时,它只起作用,因为大小(test\u labels,1)
等于大小(train\u labels,1)
在我看来,您是在混合测试和train案例。我假设在训练模型后,你用它来预测90个测试图像?那么?什么是W'
和B
?什么是size
是W'*test\u image\u feats'+B
?W'是一个1乘200的矩阵,B是一个标量值(偏移值)。您能提供更多的代码吗?对我来说,“分数”的大小没有任何意义。它应该是什么?您的测试用例的预测分数是多少?在这种情况下,它应该是9乘90,而不是9乘459。您还说有9个标签,但这9个标签是否在“tmp”中一致指定?您尝试预测90个图像的分数,并使用一个矩阵,其中可以包含459个分数。“分数”必须是9*“测试图像数”。显然,错误信息非常清楚。但对我来说,这句话从概念的角度看是没有意义的。虽然你可能觉得很明显,但它仍然是OP所要求的。这个答案解释了错误信息。“测试矩阵显然与训练矩阵的大小不同。”来自OP的问题。这并不是OP真正想要的,但无论如何……谢谢你,这就是解决办法。我知道大小不同,但没有编辑它,因为90小于459,所以理论上它应该使用90列,剩下的列为0。我认为当矩阵小于所需数量时会出现问题。但我想这不是它的工作原理。
scores = zeros([num_categories size(test_labels, 1)]);