在 CNN 提取特征之上使用 SVM - 如何进行多类分类?
Posted
技术标签:
【中文标题】在 CNN 提取特征之上使用 SVM - 如何进行多类分类?【英文标题】:Using SVM on top of CNN extracted features - How to do Multi-Class classification? 【发布时间】:2019-06-09 06:37:03 【问题描述】:在 MNIST 数据集中,有 10 个分类输出。现在,我喜欢使用 SVM 作为分类任务的分类器。我使用 CNN 架构(不包括顶层或分类器)先从原始图像中提取特征,然后将其拟合到 SVM 分类器中。
SVM 是一个二元分类器,因此我们可以使用 One-vs-One 或 One-vs-Rest 方法来做这些事情。我使用以下来自 sci-kit learn 官方文档的实现代码。但无法意识到我指定在哪里对多类标签进行建模,或者这是 One-One 或 One-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 或类似分类器中是否可以?
【问题讨论】:
如果您的训练数据集包含两个以上的类,SVM 将自动处理多类。如果您查看流行的 Iris 分类 link,它有 3 个类别。使用混淆矩阵检查 MNIST 数据集是个好主意 【参考方案1】:使用一对一休息或一对一的决策天气在分类器的“decision_function_shape”参数中设置(参见doc for svc)。那里说:
是否像所有其他分类器一样返回形状为 (n_samples, n_classes) 的一对一 ('ovr') 决策函数,还是返回 libsvm 的原始一对一 ('ovo') 决策函数形状 (n_samples, n_classes * (n_classes - 1) / 2)。然而,一对一('ovo')总是被用作多类策略。 在 0.19 版更改:decision_function_shape 默认为“ovr”。 0.17 版中的新功能:推荐使用 decision_function_shape='ovr'。 在 0.17 版中更改:不推荐使用 decision_function_shape='ovo' 和无。
所以现在 one vs rest 是默认设置,由于您没有指定此参数,它可能是您的代码中使用的参数。
关于在拟合之前使用 CNN 进行特征提取的问题:一般来说它应该可以工作。但是,使用正确的内核应该不是必需的。如果您想减少特征向量的维度,您可以使用pca 或manifold embedding 等非线性嵌入方法来获得更少的特征。
希望这会有所帮助。
【讨论】:
所以,One-vs-Rest 在 SVM 中是默认的。是所有其他这种类型的二元分类器还是我们应该手动检查?为什么你说使用正确的内核,使用 CNN 提取特征并不是真的必要?如果我想降低特征向量的维数,CNN提取器和PCA之类的哪种方法更方便? @DavidLe 如有疑问,我总是会检查文档,为特定分类器实现了哪种方法。原始特征应该适合分类,因为内核允许超平面中的曲率分离数据,因此由 CNN 提取的特征并没有太大帮助(通常在我个人看来!!如果你想知道,请测试它当然...)。在便利性方面,PCA 非常快速和简单,看看它是否已经足够好也无妨。以上是关于在 CNN 提取特征之上使用 SVM - 如何进行多类分类?的主要内容,如果未能解决你的问题,请参考以下文章