如何使用把CNN提取的特征用SVM做分类训练

由于SVM学习的超平面是距离各个类别样本点最远的平面,用于分类的可靠性是机器学习工具中最好的。
因此CNN卷积层提取的特征向量(倒数第二层全连接层),送给SVM进行分类,泛化能力应该比原来的softmax效果好。

查资料得知,最后一层配置成HingeLoss,相当于SVM,分类器。

QQ图片20180510004910.jpg

 
使用时,先用原始CNN网络训练,得到很好的准确度之后,把Loss改成HingeLoss,然后把卷积层以及倒数第二层以前的全连接层lr_mult都改成0,这样就固定了特征提取,训练时就只训练最后的SVM分类器。
 
经过一段时间训练之后,CNN+SVM就训练好了,这时拿来做分类,效果会更理想。
 
不过问题来了,做分类时,是不是要修改网络结构呢?因为原本是Softmax做分类预测的,如何也改成SVM的预测方式。
已邀请:

mhaoyang - 机器视觉算法工程师 电子工程硕士

赞同来自:

问题已经解决了。
只要把训练模型中SoftmaxWithLoss改成HingeLoss即可,其他的不用动。

原理:
我的网络架构是Conv1,Conv2,Conv3,FC1,FC2
FC2到输出的Loss为HingeLoss,即采用最大类间分类平面的原则。

SoftMax是FC2的输出结果,选出可能性最大的那个的一种方法,跟最后一层FC是否采用SVM无关。
经过实验,采用HingeLoss的网络,在小类别分类时(实验8类,每一类1300张图),泛化能力更强,分类更准确(相比softmax准确性大约提升30%)。
 
经过观察发现,采用HingeLoss之后,预测的输出结果,是SVM式的,只有正确的类别是正数,其他是负数,体现了最大类间距离的特点。
而softmax的输出结果,有正有负,所以分类平面的距离不是最大的,没有SVM效果好。

 备注:要充分发挥SVM的作用,需要从头开始训练。

HingeLoss的分类结果
-8.0174761
-8.4208546
-11.150118
12.274160
-6.9373646
-11.870379
-13.203840
-15.596320
 
Softmax的分类结果
1.6685619
-12.862905
10.462059
30.990398
-3.6882401
-4.6792755
8.9996347
-30.030947

辣辣不是吃货

赞同来自:

请问不是改训练的网络结构,直接用lmdb格式的特征值怎么训练SVM呢

快乐小琳儿 - 机械

赞同来自:

请问,CNN提取的特征用svm分类后,是不是还是按照CNN的方法用测试集测试得到模型的准确率呢?

要回复问题请先登录注册