Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Matlab 我怎样才能得到一个在更大的矩阵上训练过的SVM来对不同大小的矩阵进行分类_Matlab_Image Processing_Classification_Svm - Fatal编程技术网

Matlab 我怎样才能得到一个在更大的矩阵上训练过的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'是一

我正在训练一个一对所有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'
是一个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)]);