使用SVM分类器做颜色分类走过的坑

1、保存与调用训练模型,通常训练一个模型需要很长时间,如果我们每一次想使用这个模型都需要重新训练的话,会浪费大量时间,所以我们需要用到模型的保存与调用,用到了sklearn库中的joblib模块,具体用法为:

from sklearn.externals import joblib
joblib.dump(classifier,”train_model.m”)#使用dump函数保存,classifier为训练好的				分类器模型,双引号内的为所保存模型的名字,.m为保存模型的格式。
#从本地调回模型的语法为:
classifier = joblib.load(“/../../train_model.m”)#调用模型,双引号里的是模型存储的绝对路径。

2、测试训练模型,在测试集上测试加载的模型语法为:

classifier.predict(X_test)#X_test表示的是测试集。

3、sklearn中的classification_report函数主要用于显示主要分类指标的文本报告。
4、训练集的区分,SVM一般是针对二分类而言,所以要设置对影的训练集和训练label,训练集的分类:

class01=out_image_list[0]#标注为0和1的图像分别输出到out_image_list数组中
class02=out_image_list[1]
class_0=class01[class01!=0].reshape(-1,3)#转换数据存储形式
class_1=class02[class02!=0].reshape(-1,3)
相对应的label 设定:
color_average0=np.sum(class_0,axis=1)/class_0.shape[1]#(R+G+B)/3,灰度平均值作为特征向量矩阵
color_average1=np.sum(class_1,axis=1)/class_1.shape[1]

num_label1=len(color_average0)#得出训练集长度,方便下一步建立标记label数组
num_label2=len(color_average1)
train_data=np.r_[color_average0,color_average1]#设置训练输入数据集X
train_label=np.vstack((np.zeros((num_label1,1),dtype='uint8'),np.ones((num_label2,1),dtype='uint8')))#设置训练标签y

这里训练集含有两种类型,对应的标签应该也有两种类型,并且训练集与标签集的长度和维度都应该是一致的。

5、在进行SVM训练的时候,要注意选择对应的核函数,也就是初始化分类器,在对于核函数的选择,有时linear线形分类核函数并不能够很好的分类出两种类型,而只能分类出其中的一种,另一种的recall率为0,可以选择更换高斯核函数进行尝试:

#初始化SVM,训练分类器
params = {'kernel':'rbf'}
classifier1 = SVC()
classifier1.fit(train_data,train_label)#y_train.ravel()#扁平化处理,可去除警告,fit函数训练分类器

6、训练好的模型的保存与加载:

#模型的保存
#classifier1 = joblib.dump(classifier1,'/home/zhangqi/SVM/classifier1.pkl')
#模型的加载
#clf = joblib.load('/home/zhangqi/SVM/classifier1.pkl')

这里的pkl可以更改不固定,有的是使用的.m,有的是使用的.pkl,还有的用modle,这个可以依照需求自行查阅。
7、想将分类器应用到整幅或者多幅图像时,需要写一个循环函数,用于遍历图像中所有的像素点,将每个像素点放到分类器中进行识别,分类器会返回一个response,response含有两个值:-1与1,也就是我们前文定义的正负样本,我们可以根据这个response来进行重新规划像素点,从而实现图像的二分类。
8、在测试数据模型时,关于效果不好的时候注意调整分类器参数,如LinearSVC中的惩罚系数,SVC中gamma值等。

关于修改参数,我单独写了一篇博客,详见:

9、在测试程序运行时间时,我选择了time模块,具体实现方法为:

  from time import time 
    if __name__ == '__main__':
    	t1 = time()
    	.....#程序执行
    	t2 time()
    	time=t2-t1
    	print("time秒")

然而调试并不能通过,报错如下:

TypeError: 'float' object is not callable

单精度浮点类型追溯错误,我网上查了很多,这种类型的错误,各式各样,但是很少是关于我这种类型的,于是我开始更改float类型,强制format time的格式为float,结果可想而之,依旧报错,最后在一个同事的帮助下,将模块导入切换成如下,便可轻松解决问题:

import time 
if __name__ == '__main__':
	t1 = time.time()
	.....#程序执行
	t2 time.time()
	time=t2-t1
	print("time秒")

真的是,永远不要自以为是的认为这种情况是不可能出错的,路漫漫其修远兮,没改完所有的bug你就别说你什么bug都能改啊~

  • 3
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在MATLAB中,我们可以使用支持向量机(Support Vector Machine,SVM分类器进行多分类任务。首先,我们需要导入训练数据和标签。训练数据是包含特征的矩阵,每一行代表一个样本,每一列代表一个特征。标签是一个向量,与训练数据的行一一对应,用于表示每个样本的分类。 接下来,我们可以使用fitcecoc函数来构建一个基于SVM的多分类模型。fitcecoc函数使用"一对一"的策略来处理多分类问题。它将原始问题转化为多个二分类问题,对每个类别之间进行分类。然后,它将每个二分类器的结果进行组合,得到最终的多分类结果。 在fitcecoc函数中,我们还可以指定不同的SVM内核函数,如线性核、多项式核和高斯核等。每个内核函数都具有不同的性质和适用范围。我们可以根据实际情况选择合适的内核函数。 训练完成后,我们可以使用predict函数对新的样本进行预测。predict函数将返回每个样本属于各个类别的概率值。我们可以选择概率最大的类别作为最终的分类结果。 此外,对于多分类问题,我们还可以使用交叉验证来评估模型的性能。通过将数据划分为训练集和验证集,我们可以使用fitcecoc函数进行交叉验证,并使用loss函数计算分类错误率。 总而言之,MATLAB提供了丰富的工具和函数来构建和评估多分类SVM分类器。我们可以根据具体任务和数据特点选择合适的参数和方法,来实现准确、高效的多分类任务。 ### 回答2: 在MATLAB中,SVM(支持向量机)分类器可以用于多类别分类问题。为了使用SVM进行多类别分类,有两种常用的方法:一对一(One-vs-One)和一对其余(One-vs-All)。 一对一方法将每个类别之间进行两两组合,并构建一个二分类器来区分它们。对于一个有N个类别的问题,需要构建N*(N-1)/2个二分类器。在进行预测时,将输入样本传递给所有二分类器,每个分类器输出一个概率或得分,然后选取得分最高的类别作为最终预测结果。 一对其余方法将每个类别与其他所有类别进行组合,并构建一个二分类器。对于一个有N个类别的问题,需要构建N个二分类器。在进行预测时,将输入样本传递给所有二分类器,每个分类器输出一个概率或得分,然后选取得分最高的类别作为最终预测结果。 MATLAB中,可以使用fitcecoc函数来实现多类别SVM分类器。该函数采用一对一方法,并自动执行模型训练和预测的过程。其中,输入参数包括训练集、类别标签、SVM模型类型(例如线性SVM或高斯核函数SVM)和其他可选参数。 通过fitcecoc函数训练得到的分类器可以用于对新样本进行分类预测。可以使用predict函数来进行预测,并返回预测结果的类别标签。 总之,MATLAB中的SVM分类器支持多类别分类问题,可以使用一对一或一对其余的方法来构建多分类器。可以使用fitcecoc函数进行模型训练和predict函数进行预测。 ### 回答3: 在MATLAB中,可以使用svmtrain函数来构建支持向量机(SVM分类器,实现多分类任务。svmtrain函数基于一对一(one-vs-one)的策略,将多分类问题转化为多个二分类问题。 具体而言,svmtrain函数可以接受多个训练样本集和对应的标签,每个样本集和标签对应一个二分类问题。对于K类别的多分类问题,可以使用K倒数(K-1)/2个训练样本集和标签来构建svmtrain函数。svmtrain函数将训练多个二分类SVM模型,其中每个模型由一个训练样本集和标签对应。 训练完成后,可以使用svmclassify函数对新的数据进行分类svmclassify函数会将新数据输入到每个二分类SVM模型中,然后通过投票或其他统计方法将最终分类结果确定为K类别中的某一个。 需要注意的是,MATLAB中的svmtrain和svmclassify函数仅适用于两类和多类别的线性可分问题。如果数据集不是线性可分的,可以使用SVM中的核函数(如高斯核函数)来处理非线性问题。 总之,在MATLAB中,可以使用svmtrain函数构建基于一对一策略的SVM分类器,实现多分类任务。在训练完成后,可以使用svmclassify函数对新的数据进行分类
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值