使用SVM分类器进行图像多分类

article/2025/10/6 11:54:27

ResNet backbone + SVM分类器

对于样本较为均衡小型数据集,SVM作为分类器的效果与MLP的效果相近。
从经验上看,对于样本不均衡的大型数据集,MLP的效果强于SVM。
本博客在自己的小型数据集上进行实验,本来使用MLP已经达到很好的效果,但导师让试一下SVM分类器,可能会对样本量较小的数据集表现稍好。虽然在心里觉得SVM这种方法不太可能有提高,但趁此机会学习一下SVM还是有好处的。

SVM相关知识:

这里仅作简单陈述,详细地可百度或B站,特别多资源
基本理念:最初的SVM是用来作二分类的,目标是在特征空间中找到一个超平面,让任意样本的点到平面的距离大于等于1。
如果样本线性不可分,则需要使用核函数来进行非线性分类,也就是得到非线性超平面。

核函数

SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一。一些线性不可分的问题可能是非线性可分的,即特征空间存在超曲面(hypersurface)将正类和负类分开。使用非线性函数可以将非线性可分问题从原始的特征空间映射至更高维的希尔伯特空间(Hilbert space)H ,从而转化为线性可分问题。
引用自https://www.bilibili.com/video/BV1mP4y137U4?p=2
常见的核函数有:多项式核(阶为1时称为线性核)、径向基函数核(又称RBF核、高斯核)、拉普拉斯核、Sigmoid核。
常用线性核和高斯核。
参考自b站:https://www.bilibili.com/video/BV1mP4y137U4?p=2

线性核函数

解决问题从简单的出发,先试一下线性核函数的效果!
公式注意是内积
适用于:特征已经比较丰富了,样本数据量大,即十万、百万这数量级。

多项式核函数(了解即可,不常用):
给定3个参数,Q控制高次项,越高次对应越复杂的边界,计算量也相应越大,具体视任务情况而定
侵删
γ和Q就是要调的超参,得在炼丹过程中调整。

高斯核函数——最常用的

公式如下:
在这里插入图片描述
高斯核函数能把低维特征映射为无穷维的特征,比如有m个数据,每个数据是10维,那么根据公式可得到每个数据Xi和任意数据Xk的“距离”Dx,有m个数据,就计算m次,得到m个Xi与Xk的“距离”,然后将Xi里的第k个元素更换为Xi和Xk的“距离”,也就是变成m维了,因此可用于扩充特征维度,让模型对数据点有更好的认识和区分

σ越小,越陡,特征越鲜明,可能对分类效果略好,但是风险越大,可以看第二张图。
在这里插入图片描述
在这里插入图片描述

SVM多分类

SVM如何做多分类呢?有直接法和间接法,但直接法不常用,间接法中常用的时一对一(ovo)和一对多(ovr)策略
具体可以来看这篇文章

总结

一对一就是训练 m(m-1)/2 个分类器(m为类别总数),也就是每两个类别之间训练一个分类器,然后用投票法,将预测的变量输入到所有分类器中,预测为label k,则k的得票+1,统计所有的分类器的输出结果,得票最多的类别就是最终预测结果。
优劣:当类别很多时,model的个数是m(m-1)/2,代价很大哦

一对多就是对于第k个类别,将label k的样本设为正类,而其他类别的样本都设为负类,最后训练 m个分类器(m为类别总数)。预测时,将变量输入到所有分类器中,如果只有一个分类器输出正值,则可直接判定结果为该分类器对应的类别,否则选取判别函数值最大的分类器所对应的类别为最终预测结果。
优点:训练m个分类器,个数较少,其分类速度相对较快。
缺点:每个分类器的训练都是讲全部的样本作为训练样本,如果不是线性可分数据,训练速度会随着训练样本的数量增加而急剧减慢;同时由于负类样本的数据要远远大于正类样本的数据,从而出现了样本不对称的情况,且这种情况随着训练数据的增加而趋向严重。解决不对称的问题可以引入不同的惩罚因子,对样本点来说较少的正类采用较大的惩罚因子。还有就是当有新的类别加进来时,需要对所有的模型进行重新训练。

SVM的优缺点:引用

1、SVM算法对大规模训练样本难以实施

SVM的空间消耗主要是存储训练样本和核矩阵,由于SVM是借助二次规划来求解支持向量,而求解二次规划将涉及m阶矩阵的计算(m为样本的个数),当m数目很大时该矩阵的存储和计算将耗费大量的机器内存和运算时间。针对以上问题的主要改进有有J.Platt的SMO算法、T.Joachims的SVM、C.J.C.Burges等的PCGC、张学工的CSVM以及O.L.Mangasarian等的SOR算法。如果数据量很大,SVM的训练时间就会比较长,如垃圾邮件的分类检测,没有使用SVM分类器,而是使用了简单的naive bayes分类器,或者是使用逻辑回归模型分类。

2、用SVM解决多分类问题存在困难

经典的支持向量机算法只给出了二类分类的算法,而在数据挖掘的实际应用中,一般要解决多类的分类问题。可以通过多个二类支持向量机的组合来解决。主要有一对多组合模式、一对一组合模式和SVM决策树;再就是通过构造多个分类器的组合来解决。主要原理是克服SVM固有的缺点,结合其他算法的优势,解决多类问题的分类精度。如:与粗集理论结合,形成一种优势互补的多类问题的组合分类器。

3、对缺失数据敏感,对参数和核函数的选择敏感

支持向量机性能的优劣主要取决于核函数的选取,所以对于一个实际问题而言,如何根据实际的数据模型选择合适的核函数从而构造SVM算法。目前比较成熟的核函数及其参数的选择都是人为的,根据经验来选取的,带有一定的随意性.在不同的问题领域,核函数应当具有不同的形式和参数,所以在选取时候应该将领域知识引入进来,但是目前还没有好的方法来解决核函数的选取问题。

实现

用scikit-learn包(sklearn)中的svm即可:官网地址
SVC
LinearSVC
我的实现是使用ResNet50作为特征提取器(去掉最后一层),先加上MLP预训练35个epoch,然后将特征提取器的输出降维(1024维的特征)输入到SVM中进行训练并得到输出,然后评估结果即可。
在我的小型数据集上实现时,后续要做添加惩罚因子的实验

Class Classifer(nn.Module):def __init__(self):super(Classifier,self).__init__()renet50 = torchvision.models.resnet50(pretrained)modules = list(resnet.children())[:-1]      #delete the last fc layer.self.resnet = nn.Sequential(*modules)self.linear0 = nn.Linear(resnet.fc.in_features, 1024)def forward(self,images):features = self.resnet(images)features = features.reshape(features.size(0), -1)self.featuremap2048 = copy.deepcopy(features.detach())#ResNet的输出features = self.linear0(features)features = self.relu(features)self.featuremap1024 = copy.deepcopy(features.detach())#用一层全连接层降维后的输出...省略掉MLP的forward
for i, (images, classes, lengths) in enumerate(train_loader):# Set mini-batch datasetimages = images.to(device)classes = classes.to(device) targets = classeswith torch.no_grad():outputs = classifier(images)# featuremap是一个Tensor(batchsize, 2048),2048是resnet50去除掉最后一层后的feature输出featuremap = classifier.featuremap1024#将featuremap tensor 转为numpy array:(batchsize,2048)featuremap_np = featuremap.cpu().numpy()targets_np = targets.cpu().numpy()#用SVM进行训练svm_clf.fit(featuremap_np,targets_np)#测试np_targets_long = []  # 存整个test集的真实值outputs_label_long_list = []  # 存对整个test集的预测值for m, (images, classes, lengths) in enumerate(test_loader):images_test = images.to(device)with torch.no_grad():outputs_test_tensor = classifier(images_test)#前向计算,提取中间输出featuremap_np_test = classifier.featuremap1024.cpu().numpy()# 将targets和outputs都转为np.arraynp_targets = classes.numpy()np_outputs = svm_clf.predict(featuremap_np_test)# 将整个test集的真实值和预测值都保存np_targets_long.extend(np_targets)outputs_label_long_list.extend(np_outputs)# test finish,多分类时average选micro就是求准确度accuracytestset_acc = precision_score(np_targets_long, outputs_label_long_list, average='micro')

http://chatgpt.dhexx.cn/article/eHSYV91K.shtml

相关文章

SVM分类器原理详解

第一层、了解SVM 支持向量机,因其英文名为support vector machine,故一般简称SVM,通俗来讲,它是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,其学习策略便是间隔最大化&#xff0c…

【CV-Learning】线性分类器(SVM基础)

数据集介绍(本文所用) CIFAR10数据集 包含5w张训练样本、1w张测试样本,分为飞机、汽车、鸟、猫、鹿、狗、蛙、马、船、卡车十个类别,图像均为彩色图像,其大小为32*32。 图像类型(像素表示) 二…

支持向量机通俗导论(理解SVM的三层境界)

支持向量机通俗导论(理解SVM的三层境界) 作者:July 。致谢:pluskid、白石、JerryLead。说明:本文最初写于2012年6月,而后不断反反复复修改&优化,修改次数达上百次,最后修改于2016年1月。 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和…

[机器学习] 支持向量机通俗导论节选(一)

本文转载自:http://blog.csdn.net/v_july_v/article/details/7624837 支持向量机通俗导论(理解SVM的三层境界) 作者: July、pluskid ; 致谢:白石、J erryLead 出处:结构之法算法之道 blog …

机器学习之旅---SVM分类器

本次内容主要讲解什么是支持向量,SVM分类是如何推导的,最小序列SMO算法部分推导。 最后给出线性和非线性2分类问题的smo算法matlab实现代码。 一、什么是支持向量机(Support Vector Machine) 本节内容部分翻译Opencv教程: http://docs.open…

人工智能学习笔记 实验五 python 实现 SVM 分类器的设计与应用

学习来源 【机器学习】基于SVM人脸识别算法的一些对比探究(先降维好还是先标准化好等对比分析)_○( ^皿^)っHiahiahia…的博客-CSDN博客 实验原理 有关svm原理 请移步该篇通俗易懂的博客 机器学习算法(一&#xff0…

Matlab-SVM分类器

支持向量机(Support Vector Machine,SVM),可以完成对数据的分类,包括线性可分情况和线性不可分情况。 1、线性可分 首先,对于SVM来说,它用于二分类问题,也就是通过寻找一个分类线(二维是直线&…

UGUI——RectTransform详解

什么是RectTransform 创建一个UGUI控件时,查看其Inspector面板,原先熟悉的Transform已经被替换成RectTransform,面板也与原先的Transform的面板相去甚远。 先看看Unity官方对RectTransform的描述: Position, size, anchor and pi…

【Unity3D】UGUI之Button

1 Button属性面板 在 Hierarchy 窗口右键,选择 UI 列表里的 Button 控件,即可创建 Button 控件,选中创建的 Button 控件,按键盘【T】键,可以调整 Button 控件的大小和位置。创建 Button 控件时,系统会自动给…

UGUI基础

UGUI基础 ##1、UGUI概述 1.1、Unity界面发展史 【老版本界面onGUI】>【GUI插件NGUI】>【新版本界面UGUI】 1.2、UGUI特点 新的UI系统是从Unity4.6开始被集成到Unity编译器中的。Unity官方给这个新的UI系统赋予的标签是:灵活,快速和可视化。 对…

【Unity基础】ugui的案例篇(个人学习)

文章目录 前言案例1、点击游戏物体改变一次颜色,被UI遮挡的情况下点击无效1.动态图演示2.实现方式I.实现方案1 通过射线检测实现 3.源码演示Lua部分代码CSharp部分代码 案例2、圆形图片的制作1.图演示2.实现方式I.实现方案1 使用Mask组件实现II.实现方案2 通过重写G…

Unity UGUI源码解析

前言 这篇文章想写的目的也是因为我面试遇到了面试官问我关于UGUI原理性的问题,虽然我看过,但是并没有整理出完整的知识框架,导致描述的时候可能自己都是不清不楚的。自己说不清楚的东西,别人就等于你不会。每当学完一个东西的时…

UGUI基础学习

目录 TEXT IMAGE ROWIMAGE TEXT fontsize:字体 color:字体颜色 ;inespacing:字行间隔 代码展示: using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.UI;public class TEXTtest : MonoBehaviour {p…

UGUI源码解析——总览

一:图像相关 ——UIBehaviour:UI组件的基类,继承MonoBehaviourUGUI源码解析——UIBehaviour——CanvasUpdateRegistry:图像、布局重建注册器UGUI源码解析——CanvasUpdateRegistry——ICanvasElement:图像、布局重建接…

UGUI 全方位了解

随着 unity3d 4.6 ~ 5.x 新 UI 系统终于与大家见面了。这篇文章将不会介绍如何使用按钮、滚动条之类的UI控件,这些内容可以参考 Unity Manual;这篇文章的重点是,如何理解 UI 系统的设计,以便更好的在实际中使用它。 RectTransfor…

UI框架(UGUI)

整个游戏的工程源码下载链接:点击打开链接 可以参考的写的Demo和本文章来学习 毕竟有些细节问题在文章中不能一一说到 工具:VS2010、Unity5.2.3f 先介绍整个Demo的主面板 其中任务、技能、符文等等都是按钮,点击按钮会生成相应面板 【Pro…

UGUI相关使用

UGUI 文章目录 UGUI1.六大基础组件概述1.1 Canvas组件1.2 CanvasScaler组件1.3 Graphic Raycaster组件1.4 Event System组件1.5 Standalone Input Module组件1.6 RectTransform组件 2.三大基础控件概述2.1 图像控件Image2.2 文本控件Text2.3 RawImage原始图像组件 3.七大组合控…

Unity UGUI系统

UI系统对比 对 UI 系统的选择取决于是为 Unity 编辑器开发 UI,还是为游戏或应用程序开发运行时 UI。 UI 的类型UI 工具包Unity UI(uGUI)IMGUI注意事项运行时(调试)✔ *✔✔这指用于调试用途的临时运行时 UI。运行时(游戏内&…

UGUI 详解

1.RectTransform RectTransform组件 继承自Transform组件,是2D界面中元素的Transform。 对比Transform增加了新的属性分别是:Anchor(锚点)和 Pivot(轴心点)。 属性: localPosition:图…

UGUI学习笔记(八)UGUI不规则响应区域

一、Unity自带的点击策略 在上一篇文章中我们了解到,UI的默认响应区域是UI元素所在的矩形框线内的区域。这也就意味着,当UI的图形为不规则形状时,点击图形的外部也可能会触发事件。 但其实Unity自带了一种不规则区域点击策略。要想使用它&…