在CNN上使用SVM提取特征-如何进行多类分类



在MNIST数据集中,有10个分类输出。现在,我喜欢使用SVM作为该分类任务的分类器。我使用CNN架构(不包括顶层或分类器)首先从原始图像中提取特征,然后将其拟合到SVM分类器中。

SVM是一种二元分类器,因此我们可以使用One vs OneOnevs Rest方法来做这些事情。我使用下面实现的代码从sci工具包学习官方文档。但无法意识到我指定在哪里建模多类标签,或者这是OneOne Rest方法。

数据集形状如下:

train : (2045, 32, 32)
label : (2045, 10)

使用非顶部CNN代码提取特征后,我们得到:

train : (7636, 256)  < - cnn_Xtrain
label : (7636,)      < - Ytrain

我尝试过的SVM分类器

# SVC classifier
SVMC = SVC(probability=True)
svc_param_grid = {'kernel': ['rbf'], 
'gamma': [0.0001, 0.001],
'C': [1, 10, 50]}
gsSVMC = GridSearchCV(SVMC, param_grid = svc_param_grid, cv = K_fold,
scoring="accuracy", n_jobs= -1, verbose = 1)
gsSVMC.fit(cnn_Xtrain, Ytrain) # fitting extracted features
SVMC_best = gsSVMC.best_estimator_

在这个分类器中,SVM如何理解这是一个多类问题或一对一或一对其余问题?评分结果对我来说更可疑,我确实评价了将近98%。网格搜索(RBF)中指定的内核对此负责吗?或者我只是做错了什么?

此外,使用CNN代码从原始图像中提取特征,然后将其拟合到SVM或类似分类器中,可以吗?

在分类器的"decision_function_shape"参数中设置了使用one vs rest或one vs one的决策天气(参见svc的文档)。上面写着:

是像所有其他分类器一样返回形状(n_samples,n_classes)的一对一('ov')决策函数,还是返回具有形状(n_samples,n_classes*(n_classes-1)/2)的libsvm的原始一对一决策函数。然而,一对一('vo')总是被用作多类策略。在0.19版本中更改:decision_function_shape默认为"ovr"。0.17版本中的新功能:建议使用decision_function_shape="vr"。在版本0.17中更改:弃用decision_function_shape='vo'和None。

所以现在onevsrest是默认的,因为您没有指定这个参数,所以它可能是代码中使用的参数。

至于你关于在拟合前使用CNN进行特征提取的问题:一般来说,它应该有效。然而,使用正确的内核应该不是真正必要的。如果你想降低特征向量的维数,你可以只使用主成分分析或非线性嵌入方法,如流形嵌入,以获得更少的特征。

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新