MATLAB LS-SVM工具箱实战:从分类回归到调参避坑
简介这份资源是面向机器学习研究者与工程师的Matlab版LS-SVMlab1.5工具箱用于在Matlab环境中实现最小二乘支持向量机解决非线性分类与回归问题。包内共81个文件以64个m函数脚本为核心覆盖训练、调参、预测与评估全流程另含9个dll动态库与8个exe可执行程序压缩包约217KB体积轻便易于部署。工具箱提供线性、多项式、高斯RBF等多种核函数支持交叉验证与网格搜索来优化惩罚系数C和核宽γ并附带可视化函数帮助理解决策边界与支持向量分布。内容预览显示其包含trainlssvm、predict、tunelssvm、crossvalidate、plotlssvm等完整模块以及多类编码、稀疏化、鲁棒回归等进阶脚本和演示示例便于读者快速上手并迁移到实际工程任务中。目前已有316人学习下载适合希望深入掌握LS-SVM原理与Matlab实现的中高级读者参考使用。1. 别急着调参MATLAB 里的 LS-SVM 工具箱到底解决什么问题如果你手头有一批几百到几千行的工况数据想做二分类或回归SVM 训练慢、调参玄学、交叉验证跑一晚上还没收敛那 MATLAB 的 LS-SVM 工具箱就是冲着这个痛点来的。它把标准 SVM 的二次规划问题改写成一组线性方程组求解用最小二乘损失替代 hinge 损失训练速度通常快一个量级代价是解失去稀疏性——支持向量几乎覆盖全部样本。这不是缺陷是取舍样本量不大、追求训练速度和部署简洁时它非常划算。适合谁做设备故障诊断、光谱定量、软测量建模的工程师尤其是需要在 MATLAB 里快速迭代、又不想手写 QP 求解器的人。下面按「原理选型 → 环境搭建 → 分类实战 → 回归实战 → 避坑 → 进阶」推一遍。2. 先搞懂 LS-SVM 的数学取舍再决定要不要用2.1 从标准 SVM 到 LS-SVM等式约束换来了什么标准 SVM 的原始问题是带不等式约束的凸二次规划求解要靠 SMO 或内点法样本一多就慢。LS-SVM 把不等式约束改成等式约束损失项从 hinge 换成平方误差构造拉格朗日函数后对偶问题退化成线性方程组[0 1^T ] [b ] [0 ] [1 K I/γ ] [α ] [y ]其中 K 是核矩阵γ 是正则化参数α 是拉格朗日乘子。解这个方程组只需要一次矩阵求逆或 Cholesky 分解复杂度 O(n³) 但常数极小。代价是 α 不再稀疏预测时要算所有训练样本的核函数样本量上万时预测会变慢。所以选型判断很简单训练样本几千以内、预测实时性要求不极端LS-SVM 合适样本十万以上、要求稀疏解回去用标准 SVM 或线性模型。2.2 核函数怎么选RBF 是默认答案但不是唯一答案MATLAB 的 LS-SVM 工具箱通常提供线性、多项式、RBF 三类核。RBF 核K(x,x) exp(-||x-x||²/(2σ²))是绝大多数场景的起点因为它只要求调 σ 和 γ 两个参数且对特征尺度敏感——这既是优点也是坑。线性核适合特征维度远大于样本数的情况比如文本分类多项式核在图像相关任务里偶尔有用但参数多、数值不稳定新手不建议碰。我一般先用 RBF 跑一版基线再决定要不要换。2.3 参数 γ 和 σ² 的物理含义别把它们当黑箱γ 控制正则化强度γ 越大对训练误差惩罚越重模型越倾向过拟合γ 越小模型越平滑可能欠拟合。σ² 控制 RBF 核的宽度σ² 越大核越平缓决策边界越平滑σ² 越小核越尖锐容易过拟合。两者存在耦合单独调一个往往白费功夫。常见做法是在对数网格上做二维搜索比如 γ 取2.^(-5:5)σ² 取2.^(-5:5)用交叉验证误差选最优组合。3. 在 MATLAB 里把 LS-SVM 跑起来环境、数据与最小分类示例3.1 工具箱获取与路径配置MATLAB 本身不内置 LS-SVM常见做法是使用公开的 LS-SVMlab 工具箱一个广泛流传的 MATLAB 实现下载后解压到本地目录用addpath加入搜索路径。注意不要和 MATLAB 自带的 Statistics and Machine Learning Toolbox 里的fitcsvm混淆后者是标准 SVM不是 LS-SVM。% 假设工具箱解压在 D:\tools\lssvmlab addpath(genpath(D:\tools\lssvmlab)); savepath; % 保存路径避免每次重启都要加 % 验证查看核心函数是否存在 which trainlssvm which simlssvm逻辑说明genpath会递归加入子目录因为工具箱通常把训练、预测、调参函数分在不同文件夹。savepath把路径写入pathdef.m下次启动自动生效。如果which返回空说明路径没加对检查解压目录层级。3.2 数据准备归一化和训练测试划分LS-SVM 对特征尺度敏感尤其是 RBF 核。我一般先做 z-score 归一化再划分训练集和测试集。下面用 MATLAB 自带的鸢尾花数据集做二分类演示。load fisheriris; % 取前两类做二分类 X meas(1:100, 3:4); % 取两个特征方便可视化 Y ones(100,1); Y(51:100) -1; % LS-SVM 标签用 1/-1 % z-score 归一化 X (X - mean(X)) ./ std(X); % 划分训练集和测试集固定随机种子保证可复现 rng(42); idx randperm(100); trainIdx idx(1:70); testIdx idx(71:100); Xtrain X(trainIdx,:); Ytrain Y(trainIdx); Xtest X(testIdx,:); Ytest Y(testIdx);逻辑说明标签必须转成 1/-1LS-SVM 内部按符号判断类别。归一化用训练集的均值和标准差但这里为了简化直接对全量做了——严格做法是只用训练集统计量再应用到测试集避免信息泄漏。rng(42)固定随机种子保证每次划分一致方便对比调参效果。3.3 训练与预测type 和 kernel 参数怎么填% 设置模型参数 type classification; kernel RBF_kernel; gam 10; % 正则化参数 γ sig2 1; % RBF 核宽度 σ² % 训练 [alpha, b] trainlssvm({Xtrain, Ytrain, type, gam, sig2, kernel}); % 预测 Ypred simlssvm({Xtrain, Ytrain, type, gam, sig2, kernel, preprocess}, ... {alpha, b}, Xtest); % 计算准确率 acc sum(Ypred Ytest) / length(Ytest); fprintf(测试集准确率: %.2f%%\n, acc * 100);逻辑说明trainlssvm返回拉格朗日乘子alpha和偏置b这两个就是模型的全部参数。simlssvm的输入是一个元胞数组前几项必须和训练时一致preprocess表示使用工具箱内置的预处理如果训练时用了。预测输出是 1/-1 标签直接和真实标签比较算准确率。参数gam和sig2先给经验值下一步用网格搜索优化。3.4 用交叉验证做参数网格搜索gamList 2.^(-5:5); sig2List 2.^(-5:5); bestAcc 0; bestGam 0; bestSig2 0; for g gamList for s sig2List % 用 5 折交叉验证评估 cost crossvalidate({Xtrain, Ytrain, type, g, s, kernel}, 5, misclass); if (1 - cost) bestAcc bestAcc 1 - cost; bestGam g; bestSig2 s; end end end fprintf(最优 γ%.4f, σ²%.4f, 交叉验证准确率%.2f%%\n, ... bestGam, bestSig2, bestAcc * 100);逻辑说明crossvalidate是工具箱提供的交叉验证函数第三个参数misclass表示用误分类率作为代价。两层循环遍历 11×11 网格每个组合跑一次 5 折交叉验证总共 605 次训练。样本量小时可以接受样本量大时建议改用tunelssvm做单纯形优化速度更快。注意网格范围要根据数据尺度调整2.^(-5:5)只是起点。4. 回归任务怎么落地从函数拟合到软测量建模4.1 回归与分类的接口差异LS-SVM 回归的type填function estimation标签 Y 是连续值不需要转成 ±1。核心方程和分类一样只是输出不再是符号判断而是f(x) Σ α_i K(x, x_i) b。下面用一个带噪声的正弦函数做拟合演示。% 生成回归数据 rng(1); X linspace(-3, 3, 200); Y sin(X) 0.1 * randn(size(X)); % 划分训练测试 idx randperm(200); Xtrain X(idx(1:150)); Ytrain Y(idx(1:150)); Xtest X(idx(151:end)); Ytest Y(idx(151:end)); % 训练回归模型 type function estimation; kernel RBF_kernel; gam 100; sig2 0.5; [alpha, b] trainlssvm({Xtrain, Ytrain, type, gam, sig2, kernel}); % 预测 Ypred simlssvm({Xtrain, Ytrain, type, gam, sig2, kernel}, ... {alpha, b}, Xtest); % 评估均方根误差 rmse sqrt(mean((Ypred - Ytest).^2)); fprintf(测试集 RMSE: %.4f\n, rmse);逻辑说明回归的gam通常要比分类大一些因为要拟合连续曲线。sig2控制核宽度太小会导致过拟合、曲线震荡太大则欠拟合、曲线过于平滑。RMSE 是回归的常用指标但要注意如果 Y 的量纲很大RMSE 的绝对值不好判断建议同时看归一化后的误差或 R²。4.2 回归调参γ 和 σ² 的敏感度差异回归任务里σ² 对拟合效果的影响通常比 γ 更敏感。我的经验是先用较大的 γ比如 100~1000固定住单独调 σ²找到曲线形状大致合理后再微调 γ。下面是一个简化的调参脚本。sig2List [0.1 0.2 0.5 1 2 5]; gamList [10 50 100 500 1000]; bestRMSE inf; bestGam 0; bestSig2 0; for g gamList for s sig2List cost crossvalidate({Xtrain, Ytrain, type, g, s, kernel}, 5, mse); if cost bestRMSE bestRMSE cost; bestGam g; bestSig2 s; end end end fprintf(最优 γ%.1f, σ²%.2f, 交叉验证 MSE%.4f\n, ... bestGam, bestSig2, bestRMSE);逻辑说明mse表示用均方误差作为代价函数。回归的网格范围通常比分类更宽因为连续输出的尺度变化大。如果数据做过归一化σ² 在 0.1~5 之间通常够用如果没归一化σ² 要跟着特征尺度走。交叉验证的折数在样本量小于 500 时用 5 折大于 500 时用 10 折更稳。4.3 多输出回归的处理方式LS-SVM 原生只支持单输出。如果要做多输出回归常见做法是对每个输出维度单独训练一个模型预测时分别调用再拼接。这样做忽略了输出之间的相关性但在工程上简单可靠。另一种做法是把多输出问题转成多个二分类问题但那是分类的思路回归不适用。% 假设 Ytrain 是 n×2 的矩阵两个输出维度 numOutputs size(Ytrain, 2); models cell(numOutputs, 1); for k 1:numOutputs models{k} trainlssvm({Xtrain, Ytrain(:,k), type, gam, sig2, kernel}); end % 预测 Ypred zeros(size(Xtest,1), numOutputs); for k 1:numOutputs Ypred(:,k) simlssvm({Xtrain, Ytrain(:,k), type, gam, sig2, kernel}, ... models{k}, Xtest); end逻辑说明每个输出维度独立训练模型之间不共享参数。如果输出维度之间强相关可以考虑在特征层面做变换或者改用支持多输出的其他模型。工程上独立训练的好处是某个维度出问题不影响其他维度排查方便。5. 避坑与排查LS-SVM 落地时最容易翻车的五个地方5.1 现象训练集准确率 100%测试集惨不忍睹原因γ 太大或 σ² 太小模型把训练样本的噪声也拟合进去了。LS-SVM 因为解不稀疏过拟合的表现比标准 SVM 更隐蔽——训练误差降得很快但泛化误差在某个点后开始上升。解决把 γ 调小一个量级σ² 调大一个量级重新跑交叉验证。如果还是过拟合检查特征是否太多、样本是否太少考虑降维或增加数据。交叉验证的折数不要低于 5否则评估本身就不稳。5.2 现象矩阵求逆报错或结果全是 NaN原因核矩阵奇异或接近奇异常见于 σ² 极小、特征高度相关、或数据没归一化导致数值范围差异巨大。解决先做 z-score 归一化确保每个特征均值 0、方差 1。如果 σ² 已经很小适当调大。工具箱内部通常会对核矩阵加一个小的对角项相当于数值正则化但如果报错说明加得不够可以手动在训练前对数据做 PCA 降维去掉相关特征。5.3 现象预测时速度慢得离谱原因LS-SVM 的解不稀疏预测时要计算测试样本和所有训练样本的核函数。训练样本 5000 个、测试样本 1000 个就要算 500 万次核函数。解决如果预测实时性要求高要么减少训练样本比如用聚类中心代替原始样本要么换回标准 SVM。另一个思路是预计算核矩阵并缓存但内存占用会上去。工程上我一般把训练样本控制在 2000 以内超过就考虑分块或换模型。5.4 现象交叉验证结果波动很大每次跑都不一样原因数据划分随机性导致。样本量越小波动越明显。另外如果数据本身有顺序比如时间序列随机划分会破坏时序结构。解决固定随机种子保证每次划分一致。如果是时间序列用时间序列交叉验证前向链式不要用随机 K 折。样本量小于 200 时交叉验证的方差本身就大建议用留一法或重复多次 K 折取平均。5.5 现象换了数据集后之前的参数完全不能用原因γ 和 σ² 的最优值和数据尺度、样本量、噪声水平都相关没有通用值。归一化方式变了最优参数也会变。解决把调参脚本封装成函数每次换数据自动跑一遍网格搜索。归一化参数均值和标准差要保存下来预测新样本时用同样的参数做变换否则训练和预测的尺度不一致结果必然错。6. 进阶技巧用贝叶斯优化替代网格搜索以及模型部署的轻量化网格搜索在参数多的时候计算量爆炸。LS-SVM 只有两个参数网格还能扛但如果要同时选核函数类型、做特征选择网格就不够了。MATLAB 的bayesopt可以接进来把交叉验证误差作为目标函数通常几十次迭代就能找到比网格更优的点。% 定义目标函数输入是 [log10(gam), log10(sig2)] fun (params) crossvalidate({Xtrain, Ytrain, type, ... 10^params.loggam, 10^params.logsig2, kernel}, 5, mse); % 定义参数搜索范围 vars [optimizableVariable(loggam, [-3, 3]), ... optimizableVariable(logsig2, [-3, 3])]; % 贝叶斯优化 results bayesopt(fun, vars, MaxObjectiveEvaluations, 50, ... IsObjectiveDeterministic, false, Verbose, 0); bestGam 10^results.XAtMinObjective.loggam; bestSig2 10^results.XAtMinObjective.logsig2; fprintf(贝叶斯优化最优 γ%.4f, σ²%.4f\n, bestGam, bestSig2);逻辑说明bayesopt在参数空间里建高斯过程代理模型每次迭代选最有希望的点去评估比网格搜索省评估次数。IsObjectiveDeterministic设为false因为交叉验证有随机性。搜索范围取对数尺度因为 γ 和 σ² 的最优值通常跨几个数量级。50 次评估在样本量几百时几分钟能跑完比 121 次网格搜索快一倍以上。模型部署方面训练完的alpha和b就是全部参数加上训练样本和核函数参数可以打包成一个结构体保存。预测时只需要实现核函数计算和矩阵乘法不依赖工具箱。我一般把预测逻辑写成独立的.m文件只依赖基础 MATLAB 函数这样换机器或交给别人用都不会因为路径问题翻车。% 保存模型 model.alpha alpha; model.b b; model.Xtrain Xtrain; model.gam bestGam; model.sig2 bestSig2; model.kernel kernel; save(lssvm_model.mat, model); % 独立预测函数不依赖工具箱 function ypred predict_lssvm(model, Xnew) n size(Xnew, 1); K zeros(n, size(model.Xtrain, 1)); for i 1:n for j 1:size(model.Xtrain, 1) diff Xnew(i,:) - model.Xtrain(j,:); K(i,j) exp(-sum(diff.^2) / (2 * model.sig2)); end end ypred K * model.alpha model.b; end逻辑说明独立预测函数只做核函数计算和线性组合不调用工具箱任何函数。model结构体保存了预测所需的全部信息。这样部署时只需要这个函数和.mat文件不依赖工具箱路径。注意Xnew必须用训练时的归一化参数做同样的变换否则预测结果会偏。最后说个血泪经验LS-SVM 的调参没有后悔药每次换数据都得重新来一遍。我现在的习惯是把数据预处理、调参、训练、评估、保存模型写成一个完整的脚本换数据只改数据加载部分其他全自动跑。这样虽然前期多花半小时写脚本但后面省下的时间远不止这点。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

TR101290错误转换与三级优先级:从TS流监测到可执行总结

TR101290错误转换与三级优先级:从TS流监测到可执行总结

简介:这份 TR101290 总结文档面向数字电视与 MPEG-2 传输流初学者,系统梳理 ES、PES、TS、PS 四种数据流层次,并逐一讲解 PAT、PMT、CAT、NIT 等 PSI 表的 PID 取值与解析流程,可帮助读者快速建立传输流复用与节目定位的整体框架&…

2026/10/13 4:24:05 阅读更多 →
MNIST数据增强实战:从0.993到0.997的PyTorch提分路径

MNIST数据增强实战:从0.993到0.997的PyTorch提分路径

1. 当你以为MNIST已经"到头了",其实差得远先问一个问题:你在Digit Recognizer比赛里跑过baseline吗?如果跑过,你一定经历过那种"数字识别还能玩出什么花"的空虚感——一个简单的CNN就能在验证集上轻松做到99%…

2026/10/13 4:24:05 阅读更多 →
供水管网漏损监测中的压力数据解析与预警算法实践

供水管网漏损监测中的压力数据解析与预警算法实践

半夜两点,值班电话响了,说是某片区的供水压力突然往下掉,调度大屏上已经标红。我到现场一查,压力变送器没坏,线路也通,问题出在上位机——原始值翻倍了,1.2MPa的管网压力被解成了2.4MPa。这种问…

2026/10/13 4:24:05 阅读更多 →

最新新闻

人脸表情识别源代码实战:从人脸检测到实时情绪分析完整链路

人脸表情识别源代码实战:从人脸检测到实时情绪分析完整链路

简介:面向计算机视觉入门与进阶开发者的OpenCV人脸表情识别工程,完整实现从人脸检测到表情分类的经典流程,覆盖喜、怒、哀、乐、惊喜等多种情绪状态,适合作为课程设计、算法实验或人机交互项目的参考起点。压缩包共151个文件&…

2026/10/13 5:12:27 阅读更多 →
人脸表情识别实战:从训练到部署的完整避坑指南

人脸表情识别实战:从训练到部署的完整避坑指南

简介:这是一套基于OpenCV实现的人脸检测与表情识别完整工程,面向计算机视觉初学者与希望快速上手表情识别项目的开发者。项目覆盖人脸定位、特征提取、分类识别全流程,可识别喜、怒、哀、乐、惊喜等常见情感状态,并附有可直接运行…

2026/10/13 5:12:27 阅读更多 →
AI生成代码必须审核:风险分级与工程实践指南

AI生成代码必须审核:风险分级与工程实践指南

1. 这个问题为什么值得认真聊1.1 从一次真实的翻车说起上个月帮一个做后端的朋友看线上事故。故障现象很怪:某个订单状态在特定条件下会从“已支付”直接跳回“待支付”,而且只在每天凌晨两三点出现。查了两天日志,最后定位到一段三个月前由 …

2026/10/13 5:12:27 阅读更多 →
Keras中GRU参数量精确计算与工程影响解析

Keras中GRU参数量精确计算与工程影响解析

1. 项目概述:为什么GRU参数量比LSTM少,却常被忽略这个细节?“神经网络学习小记录37——Keras实现GRU与GRU参数量详解”,光看标题就知道这不是一篇泛泛而谈的教程。它直指一个在实际建模中反复被踩坑、却极少被系统拆解的问题&…

2026/10/13 5:12:27 阅读更多 →
论文格式检查一遍要多久?科迅捷AI把答案写在工具里

论文格式检查一遍要多久?科迅捷AI把答案写在工具里

"格式检查一遍要多久?"如果人工逐项核对,一篇两万字的论文,从标题层级、字体字号、行距缩进,到页码页眉、图表编号、参考文献,全部过一遍,快则一两个小时,慢则一下午。而且检查完还不…

2026/10/13 5:12:27 阅读更多 →
HTTPS加密原理全解析:从对称加密、非对称加密到CA认证和中间人攻击

HTTPS加密原理全解析:从对称加密、非对称加密到CA认证和中间人攻击

你大概也遇到过这类状况:地址栏明明挂着绿色的小锁,你用抓包代理工具调试接口时却只能看到满屏乱码,装了一个本地证书之后流量瞬间可读;又或者某天打开网页,浏览器突然弹出“您的连接不是私密连接”,底下还…

2026/10/13 5:11:26 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →