尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

SVM图片分类实战:从核心原理到特征工程与调参优化

SVM图片分类实战:从核心原理到特征工程与调参优化 简介在机器学习领域分类算法旨在从数据中学习决策边界以区分不同类别。支持向量机SVM的核心原理是寻找一个能产生最大间隔的超平面这源于统计学习理论对模型泛化能力的追求通过最大化分类边界与最近数据点的距离来提升对未知数据的鲁棒性。其技术价值在于将几何直觉转化为可求解的凸优化问题并借助核技巧高效处理非线性可分数据使其在小样本、高维场景下表现稳健。应用场景广泛尤其在计算机视觉的图片分类任务中常与特征提取技术结合。本文聚焦于SVM在图片分类中的工程实践详细拆解了从特征工程到模型调参的全流程并深入探讨了核函数与对偶问题等关键概念为相关项目提供实用指南。1. 从“线性规划”到“最大间隔”SVM的直觉与核心思想最近在整理一些老项目的代码翻到了一个用支持向量机SVM做图片分类的早期尝试。虽然现在深度学习大行其道但SVM在特定场景下尤其是小样本、高维特征且类别边界相对清晰的问题上依然有其独特的魅力和实用价值。很多人一提到SVM就觉得它是个“黑盒”分类器或者被“核函数”、“对偶问题”这些术语吓退。其实它的核心思想非常直观甚至可以说它是我见过的最“几何”的机器学习算法之一。今天我就从一个实践者的角度聊聊如何用SVM做图片分类并深入拆解其背后的原理、实操中的关键步骤以及那些容易踩坑的地方。简单来说SVM的目标是找到一个最优的“决策边界”一个超平面来分隔不同类别的数据点。但这个“最优”的定义非常巧妙它不仅要能正确分类还要让这个边界离两边的数据点都尽可能的远。这个“尽可能的远”的距离就是所谓的“间隔”Margin。SVM本质上就是在寻找那个能产生“最大间隔”的决策边界因此它也被称为最大间隔分类器。为什么追求最大间隔从统计学习理论的角度看这通常意味着更好的泛化能力即对未见过的数据有更强的鲁棒性。你可以想象一下如果一条马路决策边界越宽间隔越大车辆新的数据点就越不容易开出路外被错误分类。那么这和“线性规划”有什么关系呢在最基础的线性可分情况下寻找最大间隔超平面可以被形式化为一个凸二次规划问题。这其实是SVM理论优美的一部分它将一个直观的几何问题转化成了一个有成熟优化方法可解的数学问题。而“核函数”的引入则是为了解决线性不可分的情况它通过一个巧妙的“升维”技巧将原始空间中线性不可分的数据映射到一个更高维的特征空间使其在那个空间里变得线性可分而这一切计算都可以在原始空间通过核函数高效完成避免了直接计算高维向量的内积这就是所谓的“核技巧”。对于图片分类任务我们通常不会直接把像素值扔给SVM。一张图片的像素矩阵维度极高例如224x224的RGB图就有150528维且像素之间关系复杂直接使用不仅计算量大效果也往往不好。更常见的做法是先使用特征提取器如SIFT、HOG或现代常用的预训练CNN的特征将图片转化为一个固定长度的、更具判别性的特征向量然后再将这个特征向量作为SVM的输入。这样SVM就扮演了一个高效分类器的角色。2. 图片分类实战从特征工程到SVM模型训练理解了SVM的核心思想后我们来看如何将其应用于图片分类。整个过程可以清晰地分为几个阶段数据准备、特征提取、模型训练与评估。我会以经典的“猫狗分类”二分类任务为例但方法可以轻松扩展到多分类。2.1 数据准备与预处理任何机器学习项目的第一步都是处理数据。对于图片分类我们需要一个结构化的数据集。假设我们有一个目录里面有两个子文件夹train/cats和train/dogs分别存放猫和狗的图片。同样有一个对应的val或test目录用于验证。首先我们需要读取图片并将其转换为数值矩阵。这里使用Python的PIL和NumPy库。from PIL import Image import numpy as np import os def load_images_from_folder(folder, label, target_size(64, 64)): images [] labels [] for filename in os.listdir(folder): img_path os.path.join(folder, filename) try: # 打开图片并转换为RGB统一尺寸 img Image.open(img_path).convert(RGB).resize(target_size) # 将图片数据转换为NumPy数组并归一化到[0,1] img_array np.array(img) / 255.0 images.append(img_array) labels.append(label) except Exception as e: print(fError loading {img_path}: {e}) return np.array(images), np.array(labels) # 加载训练数据 cat_train_imgs, cat_train_labels load_images_from_folder(path/to/train/cats, label0) dog_train_imgs, dog_train_labels load_images_from_folder(path/to/train/dogs, label1) # 合并数据 X_train np.concatenate([cat_train_imgs, dog_train_imgs], axis0) y_train np.concatenate([cat_train_labels, dog_train_labels], axis0) # 同样加载验证集 # ...这里有几个关键点统一尺寸SVM要求所有输入样本的特征维度一致。target_size需要根据你选择的特征提取方法或计算资源来决定。尺寸越大原始像素特征维度越高但计算量也越大。64x64是一个常见的起点。色彩空间转换.convert(RGB)确保所有图片都是三通道避免因灰度图或带透明通道的PNG图导致维度不一致。归一化将像素值从[0,255]缩放到[0,1]或进行标准化减均值除标准差可以加速模型收敛对基于距离的算法SVM受核函数影响通常有益。这里简单除以255。注意直接使用展平后的像素值作为特征X_train.reshape(len(X_train), -1)是一种基线方法但效果通常很差因为它完全忽略了图片的空间结构和局部信息。这只是一个教学步骤实战中我们几乎总会进行特征提取。2.2 特征提取从像素到有意义的向量这是决定SVM分类器性能的关键一步。我们不再使用原始像素而是提取更能代表图片内容的特征。方法一方向梯度直方图HOGHOG特征通过计算和统计图像局部区域的梯度方向直方图来构成特征对物体的形状和外观有很好的刻画能力在行人检测等任务上历史悠久。from skimage.feature import hog from skimage.color import rgb2gray def extract_hog_features(images): hog_features [] for img in images: # 转换为灰度图HOG通常处理单通道 gray rgb2gray(img) # 计算HOG特征 fd hog(gray, orientations9, pixels_per_cell(8, 8), cells_per_block(2, 2), visualizeFalse, feature_vectorTrue) hog_features.append(fd) return np.array(hog_features) X_train_hog extract_hog_features(X_train) X_val_hog extract_hog_features(X_val)参数解析orientations将360度梯度方向分成多少个区间通常9。pixels_per_cell每个细胞单元的大小例如8x8像素。cells_per_block每个块包含的细胞单元数量例如2x2。块内会进行对比度归一化增强特征对光照的鲁棒性。feature_vectorTrue将结果展平为一维向量。方法二深度特征使用预训练CNN这是目前更主流、更强大的方法。我们利用在大型数据集如ImageNet上预训练好的卷积神经网络CNN将其作为一个固定的特征提取器。通常我们去掉网络的最后一层分类层将倒数第二层或某个中间层的输出作为特征。这些特征是高层次的语义特征。以使用ResNet50为例通过Keras可以轻松实现from tensorflow.keras.applications import ResNet50 from tensorflow.keras.applications.resnet50 import preprocess_input from tensorflow.keras.models import Model import numpy as np # 加载预训练的ResNet50不包括顶部分类层 base_model ResNet50(weightsimagenet, include_topFalse, poolingavg) # 也可以使用 include_topFalse, poolingNone然后自己加GlobalAveragePooling2D # 构建一个特征提取模型 feature_extractor Model(inputsbase_model.input, outputsbase_model.output) def extract_cnn_features(images, model): # 预处理ResNet50有特定的预处理函数 processed_imgs preprocess_input(images.copy() * 255) # preprocess_input期望[0,255] features model.predict(processed_imgs, verbose0) # 输出形状通常是 (样本数, 特征维度)例如(样本数, 2048) for ResNet50 with poolingavg return features # 注意X_train是归一化到[0,1]的需要转换 X_train_cnn extract_cnn_features(X_train, feature_extractor) X_val_cnn extract_cnn_features(X_val, feature_extractor)实操心得使用预训练CNN特征时图片的输入尺寸需要符合该网络的要求如ResNet50是224x224。我们在第一步load_images_from_folder时就应该将target_size设为(224, 224)。poolingavg参数使得模型直接输出全局平均池化后的特征向量非常方便。这种方法得到的特征维度固定如ResNet50是2048维且具有强大的语义信息通常能取得比传统特征好得多的效果。2.3 SVM模型训练、调参与评估有了特征矩阵X_train_feat和标签y_train我们就可以训练SVM了。这里使用scikit-learn库它是Python机器学习的事实标准。from sklearn import svm from sklearn.preprocessing import StandardScaler from sklearn.pipeline import make_pipeline from sklearn.metrics import classification_report, accuracy_score # 1. 创建SVM分类器管道 # 使用管道将特征标准化和SVM训练封装起来确保测试集用训练集的参数进行变换 svm_pipeline make_pipeline( StandardScaler(), # 标准化特征零均值单位方差对SVM尤其重要 svm.SVC(kernelrbf, C1.0, gammascale, random_state42, verboseTrue) # 使用RBF核 ) # 2. 训练模型 print(开始训练SVM...) svm_pipeline.fit(X_train_cnn, y_train) # 这里以CNN特征为例 print(训练完成。) # 3. 在验证集上预测和评估 y_val_pred svm_pipeline.predict(X_val_cnn) val_accuracy accuracy_score(y_val, y_val_pred) print(f验证集准确率: {val_accuracy:.4f}) print(\n分类报告:) print(classification_report(y_val, y_val_pred, target_names[Cat, Dog]))核心参数深度解析kernel核函数这是SVM的灵魂。linear线性核。适用于特征维度高、样本量相对较少或问题近似线性可分的情况。速度快可解释性强可以查看权重向量。rbf径向基函数核最常用的非线性核。通过gamma参数控制单个样本的影响范围能处理非常复杂的非线性决策边界。绝大多数情况下从rbf开始尝试是稳妥的。poly多项式核通过阶数degree控制复杂度。不如rbf常用。sigmoid相当于一个单层神经网络在某些特定场景下有用。选择建议默认从rbf开始。如果特征维度远大于样本数例如用CNN特征样本只有几千特征维度2048线性核linear也可能表现得非常好且训练更快值得对比尝试。C正则化参数这是SVM最重要的超参数之一。它控制着模型对分类错误的容忍度。C值越大模型越倾向于尽可能正确分类所有训练样本即追求更小的训练误差这可能导致模型过拟合决策边界变得非常复杂对噪声敏感。C值越小模型对错误的惩罚越小允许更多的训练样本被误分类或落在间隔内从而追求更大的间隔模型更简单可能欠拟合。可以将其理解为“模型复杂度”的调节旋钮。通常需要在网格搜索中尝试一个对数尺度范围如[0.001, 0.01, 0.1, 1, 10, 100]。gammaRBF核参数定义了单个训练样本的影响范围。gamma值越大每个样本的影响半径越小决策边界会紧贴着训练样本变得非常曲折容易过拟合。gamma值越小样本的影响半径越大决策边界更平滑可能欠拟合。gammascale是默认好选择它等于1 / (n_features * X.var())基于特征方差自动计算。gammaauto等于1 / n_features。如果自动设置效果不佳可以手动调优尝试如[0.0001, 0.001, 0.01, 0.1, 1]这样的值。class_weight如果训练数据类别不平衡例如猫的图片远多于狗可以设置为balanced让SVM自动调整类别权重防止模型偏向多数类。模型评估与调优 简单的准确率评估后我们通常需要更细致的调优。使用交叉验证网格搜索寻找最优的C和gamma组合。from sklearn.model_selection import GridSearchCV # 定义参数网格 param_grid { svc__C: [0.1, 1, 10, 100], svc__gamma: [0.0001, 0.001, 0.01, 0.1, scale, auto], svc__kernel: [rbf, linear] # 也可以对比不同核 } # 创建网格搜索对象使用3折交叉验证 grid_search GridSearchCV(svm_pipeline, param_grid, cv3, scoringaccuracy, n_jobs-1, verbose2) # 在训练集上执行网格搜索 grid_search.fit(X_train_cnn, y_train) print(f最佳参数: {grid_search.best_params_}) print(f最佳交叉验证分数: {grid_search.best_score_:.4f}) # 使用最佳模型在验证集上评估 best_model grid_search.best_estimator_ y_val_pred_best best_model.predict(X_val_cnn) print(f调优后验证集准确率: {accuracy_score(y_val, y_val_pred_best):.4f})注意事项网格搜索非常耗时尤其是数据量大、参数组合多的时候。可以先在一个小的子集上或使用较粗的参数网格进行初步搜索锁定大致范围再在完整数据集上进行精细调优。n_jobs-1可以并行使用所有CPU核心加速。3. 原理深潜SVM的数学脉络与核技巧本质很多教程在讲SVM原理时一上来就是拉格朗日对偶、KKT条件容易让人迷失。我们换个角度从“为什么”和“怎么做”来梳理其数学脉络。3.1 线性可分与硬间隔SVM假设我们有一组线性可分的二维数据点。我们想找一条线超平面w·x b 0来分开它们。这样的线有无数条。SVM选择的是“最中间”的那条即到两侧最近数据点距离最大的那条线。点到超平面的距离公式为|w·x b| / ||w||。对于正类样本y_i 1我们希望w·x_i b 1对于负类样本y_i -1希望w·x_i b -1。我们可以将这两个不等式合并为y_i (w·x_i b) 1。这个约束条件确保了所有样本都被正确分类并且距离超平面至少1 / ||w||。我们的目标是最大化间隔2 / ||w||这等价于最小化||w|| / 2或者更简便地最小化(1/2) * ||w||^2。于是我们得到了硬间隔SVM的原始优化问题最小化(1/2) * ||w||^2约束条件y_i (w·x_i b) 1对于所有训练样本i。这是一个凸二次规划问题有成熟的优化算法可解。解出的w和b就定义了最优超平面。那些使得y_i (w·x_i b) 1成立的样本点就是离决策边界最近的样本它们被称为“支持向量”。这也是算法名称的由来——整个决策边界只由这些少数的“支持向量”所决定其他样本点即使被移动只要不跨过间隔边界也不会影响结果。这赋予了SVM一定的抗噪声能力和稀疏性。3.2 线性不可分与软间隔SVM现实中的数据几乎总是有噪声或轻微线性不可分的。硬间隔SVM会因个别异常点而无法找到可行解或者得到一个非常窄的间隔泛化能力差。为此我们引入“松弛变量”ξ_i 0允许一些样本违反间隔约束。新的约束变为y_i (w·x_i b) 1 - ξ_i。同时我们在目标函数中加入对这些违反行为的惩罚(1/2) * ||w||^2 C * Σ ξ_i。这里的C就是之前提到的正则化参数。C越大对错误的惩罚越重模型越倾向于减少误分类间隔可能变窄C越小则允许更多的错误间隔变宽。这就将硬间隔推广到了软间隔使其能处理噪声和非严格线性可分的数据。3.3 对偶问题与核函数通往非线性的钥匙直接求解上述原始问题特别是引入核函数后在数学和计算上并不方便。通过拉格朗日乘子法我们可以将其转化为对偶问题。这个转化过程本身是优化理论的标准操作但其结果带来了两个巨大的好处表示定理最优的权重向量w可以表示为训练样本的线性组合w Σ α_i y_i x_i。其中α_i是拉格朗日乘子且只有支持向量对应的α_i 0。这意味着决策函数可以重写为f(x) sign( Σ α_i y_i (x_i · x) b )决策依赖于样本之间的内积(x_i · x)。核技巧观察上面的决策函数无论是求解对偶问题中的优化目标还是最终的预测函数都只涉及样本特征向量之间的内积(x_i · x_j)和(x_i · x)。 如果我们有一个非线性映射φ将原始特征x映射到高维空间φ(x)那么在高维空间中的内积就是φ(x_i) · φ(x_j)。直接计算这个高维内积可能非常昂贵甚至无限维。核函数K(x_i, x_j)的精妙之处在于它定义了这个高维内积的结果却不需要显式地计算φ(x)和φ(x_j)。我们只需要在原始空间中用一个函数计算K(x_i, x_j)其结果就等于φ(x_i) · φ(x_j)。 常用的RBF核K(x_i, x_j) exp(-γ * ||x_i - x_j||^2)就对应一个无限维的特征映射。于是我们只需将对偶问题及决策函数中的所有内积(·)替换为核函数K(·, ·)就可以隐式地在高维特征空间中训练一个线性SVM从而在原始空间中实现非线性的决策边界。这就是SVM处理非线性问题的核心——通过核函数将非线性问题在高维空间线性化。4. 多分类扩展与实战中的性能优化策略标准的SVM是一个二分类器。对于图片多分类问题例如CIFAR-10有10类我们需要一些策略来扩展。4.1 主流多分类策略OvR与OvO一对一One-vs-One OvO 为每两个类别训练一个二分类SVM。对于k个类别需要训练k*(k-1)/2个分类器。预测时让所有分类器对测试样本投票得票最多的类别获胜。优点每个分类器只用到两个类别的数据训练数据相对均衡且可能更精确。缺点分类器数量随类别数平方增长训练和预测开销较大但每个分类器训练快。scikit-learn中svm.SVC默认采用OvO。一对多One-vs-Rest OvR 为每个类别训练一个二分类SVM将该类作为正类其余所有类作为负类。共训练k个分类器。预测时取决策函数值f(x)即到超平面符号距离最大的那个类别。优点只训练k个分类器训练开销小。缺点每个分类器面临严重的类别不平衡正类样本少负类样本多可能影响性能。scikit-learn的svm.LinearSVC默认采用OvR并且针对线性核进行了优化训练速度极快。选择建议对于类别数不多如10的情况两种方法差异不大可以优先用默认的OvO。如果类别数很多如上百OvO的训练复杂度会急剧上升此时OvR或使用专门优化过的LinearSVC线性核可能是更实际的选择。对于非线性核且类别多的情况需要仔细评估训练时间和资源。在scikit-learn中我们无需手动实现这些策略# 使用SVC默认的OvO策略处理多分类 from sklearn import svm from sklearn.datasets import load_digits # 以手写数字数据集为例 from sklearn.model_selection import train_test_split digits load_digits() X, y digits.data, digits.target X_train, X_val, y_train, y_val train_test_split(X, y, test_size0.2, random_state42) # 直接使用SVC它会自动处理多分类内部使用OvO multi_clf svm.SVC(kernelrbf, C10, gamma0.001) multi_clf.fit(X_train, y_train) print(f多分类准确率: {multi_clf.score(X_val, y_val):.4f}) # 对于线性核使用LinearSVC采用OvR通常更快 from sklearn.svm import LinearSVC linear_multi_clf make_pipeline(StandardScaler(), LinearSVC(C1, random_state42, dualauto)) linear_multi_clf.fit(X_train, y_train) print(f线性SVC多分类准确率: {linear_multi_clf.score(X_val, y_val):.4f})4.2 大规模数据下的性能优化当样本量很大例如数万甚至更多时使用非线性核SVM的训练时间和内存消耗可能会成为瓶颈。以下是一些实战优化策略特征降维在特征提取后如果特征维度仍然很高例如PCA保留95%方差可以使用主成分分析PCA或线性判别分析LDA进行降维。这能显著减少计算核矩阵K(x_i, x_j)的开销。from sklearn.decomposition import PCA pca PCA(n_components0.95, random_state42) # 保留95%方差 X_train_pca pca.fit_transform(X_train_cnn) X_val_pca pca.transform(X_val_cnn) # 然后在降维后的特征上训练SVM使用线性核线性核SVMkernellinear的优化问题有非常高效的算法如坐标下降liblinear库实现。scikit-learn的LinearSVC就是为此设计的它能处理百万级样本和万维特征。即使问题是非线性的在高维特征空间如2048维的CNN特征中数据可能已经近似线性可分线性核效果可能足够好且速度快几个数量级。核近似对于非线性核可以使用核近似方法如Nystroem方法、随机傅里叶特征来显式地构造一个低维的、近似的特征映射然后在这个新的特征空间中使用线性SVM。from sklearn.kernel_approximation import Nystroem from sklearn.svm import LinearSVC nystroem Nystroem(kernelrbf, gamma0.1, n_components300, random_state42) X_train_approx nystroem.fit_transform(X_train_feat) linear_svc LinearSVC(C1, random_state42) linear_svc.fit(X_train_approx, y_train)采样与增量学习如果数据太多可以先对训练数据进行随机采样。或者使用sklearn.svm.SVC的cache_size参数来设置核矩阵缓存大小单位MB合理设置能加速迭代。对于极大问题可以考虑使用专门的大规模SVM库如LibSVMscikit-learn的后端或更高级的优化包。硬件与库优化确保你的scikit-learn使用了多线程支持n_jobs-1。对于线性SVMliblinear库本身是单线程的但可以在特征或样本层面并行化。使用数值计算库如Intel的MKL优化版scikit-learn也能获得加速。5. 常见踩坑点、调试技巧与替代方案考量在实际项目中从数据到模型上线每一步都可能遇到问题。这里分享一些我积累的经验和常见坑点。5.1 数据与特征层面的坑坑点一特征未标准化/归一化SVM尤其是使用RBF核时对特征的尺度非常敏感。如果某个特征的数值范围例如像素值0-255远大于其他特征它会主导核函数的计算导致模型性能下降。务必在训练前进行特征标准化StandardScaler或归一化MinMaxScaler。使用make_pipeline能确保训练集和测试集以相同方式变换。坑点二类别标签编码错误scikit-learn的SVM要求类别标签是整数0, 1, 2...。如果你用字符串标签‘cat‘, ’dog‘需要用LabelEncoder转换。对于多分类确保标签从0开始连续编码。坑点三样本量远小于特征维数当样本数n远小于特征数m时例如用CNN特征2048维但只有几百张训练图模型极易过拟合。此时强烈建议使用线性核。在高维空间中少量样本几乎总是线性可分的线性SVM泛化性能可能更好。增加正则化强度减小C值。使用更强的特征降维如PCA到50-100维。5.2 模型训练与调参的坑坑点四网格搜索耗时过长且结果不稳定粗搜再精搜先在C和gamma的对数尺度上如[1e-3, 1e-2, 0.1, 1, 10, 100]进行粗粒度搜索锁定最佳范围后再在附近精细搜索。使用随机搜索RandomizedSearchCV在参数空间较大时能以更少的尝试次数找到近似最优解效率更高。减少交叉验证折数在初步探索时使用2折或3折交叉验证。在小样本子集上调试先用10%-20%的数据跑通流程和参数范围。坑点五RBF核SVM训练速度慢内存占用高根本原因是需要计算和存储整个核矩阵大小为n_samples x n_samples。对于1万个样本就是100M个浮点数约800MB。首选方案尝试线性核。用LinearSVC或SVC(kernel‘linear’)。如果性能接近线性核是生产环境更优选择。次选方案使用核近似Nystroem。终极方案如果必须用RBF核且数据量大考虑使用更高效的SVM实现如thundersvmGPU加速库或转向其他算法。坑点六遇到警告“Liblinear failed to converge...”在使用LinearSVC时如果迭代次数达到上限仍未收敛会报此警告。增加max_iter参数如设为5000或10000。检查数据是否已标准化未标准化的数据可能导致优化问题条件数很差难以收敛。如果数据量不大可以尝试减小tol容忍度参数但通常不需要。5.3 结果分析与模型选择如何解读SVM的决策对于线性核SVM可以通过coef_属性查看特征权重了解哪些特征对分类贡献大具有一定的可解释性。对于非线性核决策过程是黑盒但可以通过查看支持向量来感知模型的复杂度支持向量越多模型可能越复杂。SVM vs. 其他分类器如神经网络小样本、高维特征SVM尤其是线性SVM往往表现优异因为其最大间隔原则提供了良好的泛化理论保证且不易过拟合。深度学习模型在这种场景下容易过拟合。大数据样本当数据量非常庞大ImageNet级别时深度神经网络通过端到端学习特征和分类器其性能上限通常高于“手工特征SVM”的流水线。但训练成本也高得多。训练速度线性SVM的训练速度远快于同等规模的神经网络。RBF核SVM在大数据下则很慢。特征依赖性SVM的性能极度依赖于输入特征的质量。而深度学习可以自动学习层次化特征。一个实用的决策流程数据量小10k特征已提取好如CNN特征优先尝试线性SVM。快速、有效、不易过拟合。数据量小特征未提取或为原始特征尝试RBF核SVM并与线性核对比。同时可以考虑简单的神经网络如多层感知机MLP作为对比基线。数据量大100k且有充足计算资源优先考虑深度学习进行端到端训练。可以将SVM作为顶层分类器替换Softmax进行实验但收益不一定明显。需要模型可解释性线性SVM是更好的选择。最后关于网络热词中提到的“your cpu does not support required features (vt-x or svm).”这通常是在虚拟化软件如VMware, VirtualBox中遇到的错误提示CPU不支持硬件虚拟化技术Intel的VT-x或AMD的SVM与机器学习中的支持向量机SVM完全无关只是缩写巧合。在机器学习语境下我们谈论的SVM始终是支持向量机。本文还有配套的精品资源点击获取
返回列表