最近在做一个关于卷积神经网络的SVM人脸分类的项目,昨天在调试项目的时候,遇到一个很另类的问题,解决了一天的时间,各种方法都试过,对卷积后的特征进行降维,重新去形成特征的结构等等,最后寻找到的原因是SVM训练标签出了问题。
在执行的实例程序:
import numpy as np
import cv2,random
from sklearn import svm
sample=random.sample(range(10),5)
arr=[[1,1],[2,2],[3,3],[4,4]]
labels=[[1,0],[2,0],[3,0],[4,0]]
clf=svm.SVC(decision_function_shape='ovo')
clf.fit(arr,labels)
res=clf.predict([2,2])
print(t)
出现的问题:
这里出现的是 ValueError: bad input shape (4, 2)的问题,主要的原因是设置的输出标签labels的维度错误。
我们知道SVM分类器可以解决多分类问题了,而且在sklearn包中已经有了相应的设置,直接可以训练,设置方法是把SVC的参数decision_function_shape设置为'ovo',表示一对多的模式,一般默认是一对一的模式。
但是SVM处理多分类时输出的标签不能是向量,只能是一个数,不同的数表示不同的类别,也就是在这里需要修改labels的值
labels=[1,2,3,4]
现在我们再运行程序,将正常运行!
附:
这里注意在SVM预测输出的时候,样本必须为一个二维数组,如果不是将出现以下错误:
这里需要将输入改为:
res=clf.predict([[2,2]])
或者:
tmp=[2,2
res=clf.predict(tmp)
如果我发现以上总结哪里问题,欢迎联系QQ:383714800