BP神经网络MATLAB程序包与实例:从公式到可运行代码的完整指南
简介这份资源面向机器学习初学者与需要快速上手神经网络编程的工程人员围绕BP神经网络这一经典多层前馈网络提供MATLAB环境下的完整实现代码与配套实例帮助读者理解反向传播调权、误差最小化以及网络结构设计等核心环节。压缩包共18个文件以9个m脚本为主辅以5个asv自动备份、2份pdf讲义、1份doc赛题文档和1份ppt课件整体约742KB覆盖从理论讲解到代码演练的完整链路。其中doc文档对应2001年北大B题可作为分类或回归任务的实战参考pdf则补充神经网络工具箱函数说明。目前已有172人学习。读者可借此掌握newff、train、sim等函数的用法并接触数据归一化、学习率与动量调整、正则化早停及模型评估等排错思路为后续图像识别、信号处理与时间序列预测等场景打下基础。1. BP神经网络matlab程序包及一些实例从公式到能跑的代码有多远很多人第一次接触 BP 神经网络都是在教材上看到那套链式求导公式觉得推导看懂了可一旦打开 MATLAB 想自己搭一个就卡在“数据怎么组织、权重怎么初始化、训练多久算够”这些具体问题上。标题里的“程序包及一些实例”本质上解决的就是这个断层它把反向传播从纸面公式变成一组能直接运行的.m文件再配上几个典型数据集让你能改参数、看曲线、对比结果。适合两类人一类是刚学完理论、需要跑通第一个网络的学生和转行者另一类是想用 MATLAB 快速验证某个回归或分类想法、不想从零造轮子的工程师。这一章先把 BP 在 MATLAB 里的整体轮廓立住后面几章再拆开讲实现、调参和踩坑。BP 神经网络的核心并不复杂输入层接收特征隐藏层做非线性变换输出层给出预测然后用误差反向传播去更新每一层的权重和偏置。MATLAB 提供了两种路径一种是用feedforwardnet、patternnet这类高层函数几行代码就能训练另一种是自己写前向传播和反向传播把每个矩阵运算都摊开。程序包和实例的价值就在于它通常把这两条路都覆盖了——高层函数用来快速出结果手写版本用来理解梯度到底怎么流动。你拿到一个程序包第一件事不是急着跑而是先看它的目录结构主脚本、数据文件、工具函数分别放在哪训练入口是哪个文件。这个习惯能帮你省下大量“找不到入口”的时间。2. 拆开一个 BP 程序包文件结构、数据流与训练入口2.1 典型程序包的目录长什么样一个能用的 BP 神经网络 MATLAB 程序包通常不会只有一个.m文件。它至少包含四类内容数据加载脚本、网络构建与训练脚本、评估与绘图脚本、以及若干工具函数。下面是一个常见的目录组织方式你可以对照自己手头的包检查是否完整。bp_demo/ ├── main_train.m % 训练入口负责串联整个流程 ├── load_data.m % 读取数据并做归一化 ├── build_net.m % 定义网络结构、传递函数、训练参数 ├── train_net.m % 调用训练函数并保存结果 ├── evaluate.m % 计算误差指标、画对比图 ├── utils/ │ ├── normalize_minmax.m │ └── split_dataset.m └── data/ ├── regression_data.mat └── classification_data.mat这个结构的好处是职责分离你想换数据集只改load_data.m想换网络层数只改build_net.m想换评估指标只改evaluate.m。很多初学者把所有逻辑塞进一个脚本结果调一次参数就要翻半天代码这是第一个要避免的习惯。2.2 数据流从原始矩阵到网络输入BP 网络对输入数据的尺度非常敏感。如果某一列特征的数值范围是 0 到 10000另一列是 0 到 1梯度下降会被大数值那一列主导训练要么震荡要么极慢。所以程序包里通常会有一步归一化。常见做法是把每一列线性映射到[-1, 1]或[0, 1]。下面是一个最小可用的归一化函数。function [X_norm, ps] normalize_minmax(X) % 按列做 min-max 归一化ps 保存参数以便对测试集做同样变换 X_min min(X, [], 1); X_max max(X, [], 1); range X_max - X_min; range(range 0) 1; % 防止某一列全相同导致除零 X_norm (X - X_min) ./ range; % 映射到 [0,1] ps.min X_min; ps.max X_max; ps.range range; end这里的关键是ps结构体。训练集归一化后测试集必须用同一组min和max否则训练和推理的尺度不一致结果会莫名其妙变差。我见过不少人训练集归一化、测试集忘了处理最后抱怨“模型泛化能力差”其实是数据管道断了。参数说明X是N×D矩阵N是样本数D是特征数返回的X_norm同尺寸ps用于后续反归一化和测试集变换。2.3 训练入口main_train.m 应该做什么训练入口脚本的任务是把“加载数据、划分训练测试、构建网络、训练、评估”串成一条线。下面是一个可以直接抄的骨架。% main_train.m clear; clc; rng(42); % 固定随机种子保证结果可复现 [X, Y] load_data(data/regression_data.mat); [X_norm, ps] normalize_minmax(X); % 按 70/15/15 划分训练、验证、测试 [idx_train, idx_val, idx_test] split_dataset(size(X_norm, 1), 0.7, 0.15); X_train X_norm(idx_train, :); % 注意转置MATLAB 网络按列存样本 Y_train Y(idx_train, :); X_val X_norm(idx_val, :); Y_val Y(idx_val, :); X_test X_norm(idx_test, :); Y_test Y(idx_test, :); net build_net(size(X_train, 1), size(Y_train, 1)); [net, tr] train(net, X_train, Y_train, useParallel, no); Y_pred net(X_test); mse_val perform(net, Y_test, Y_pred); fprintf(测试集 MSE: %.6f\n, mse_val); evaluate(Y_test, Y_pred, tr);逻辑说明rng(42)固定随机种子因为权重初始化和数据划分都带随机性不固定的话每次结果都不一样调参时无法判断是参数起作用还是运气好。X_train转置是因为 MATLAB 神经网络工具箱默认每一列是一个样本每一行是一个特征而常见的数据文件是每行一个样本。这个转置是新手最容易翻车的地方之一报错信息往往是维度不匹配但根源在数据朝向。train函数的useParallel参数在没有并行工具箱时设为no避免报错。3. 用 feedforwardnet 跑通第一个回归实例3.1 构建网络层数、神经元、传递函数怎么选feedforwardnet是 MATLAB 里最常用的 BP 网络构建函数。它的参数是一个向量表示每个隐藏层的神经元个数。比如feedforwardnet([10 5])表示两个隐藏层第一层 10 个神经元第二层 5 个。隐藏层默认传递函数是tansig输出层默认是purelin这套组合对回归问题通常够用。function net build_net(n_input, n_output) % 构建一个双隐藏层 BP 网络 hidden_sizes [12, 8]; % 隐藏层神经元数 net feedforwardnet(hidden_sizes, trainlm); net.layers{1}.transferFcn tansig; % 第一隐藏层 net.layers{2}.transferFcn tansig; % 第二隐藏层 net.layers{3}.transferFcn purelin; % 输出层回归用线性 net.trainParam.epochs 1000; % 最大训练轮数 net.trainParam.goal 1e-6; % 目标误差 net.trainParam.lr 0.01; % 学习率 net.trainParam.max_fail 20; % 验证集连续不下降次数上限 net.divideParam.trainRatio 0.7; net.divideParam.valRatio 0.15; net.divideParam.testRatio 0.15; end参数说明trainlm是 Levenberg-Marquardt 算法收敛快适合中小规模网络但内存占用随参数量增长明显如果网络很大或样本很多可以换成trainscg。max_fail控制早停验证集误差连续 20 轮不下降就停止防止过拟合。goal不要设得太小设成 0 会导致训练跑满 epochs 也不停浪费时间。3.2 训练与早停验证集到底在做什么训练过程中train函数会自动把数据按divideParam划分成训练、验证、测试三部分。训练集用来更新权重验证集用来判断何时停止测试集只在最后评估时用一次。很多人把验证集和测试集混为一谈导致评估结果偏乐观。正确的做法是调参时看验证集误差最终报告看测试集误差。[net, tr] train(net, X_train, Y_train); % tr 结构体里记录了每轮的训练/验证/测试误差 figure; plot(tr.epoch, tr.perf, b-, tr.epoch, tr.vperf, r-, tr.epoch, tr.tperf, g-); legend(训练, 验证, 测试); xlabel(轮数); ylabel(MSE); title(训练过程误差曲线);如果验证曲线在某个点之后开始上升而训练曲线还在下降说明过拟合已经发生早停点就是验证误差最低的位置。tr.best_epoch会告诉你这个位置。我一般会把这个值打印出来如果它远小于设定的epochs说明网络容量偏大或者数据量偏少需要考虑减少隐藏层神经元或增加数据。3.3 评估MSE、R 值和残差图回归问题不能只看 MSE。MSE 的量纲是目标值平方不直观。通常还会看 R 值预测与真实的相关系数和残差分布。Y_pred net(X_test); mse_val perform(net, Y_test, Y_pred); R corrcoef(Y_test(:), Y_pred(:)); fprintf(MSE %.6f, R %.4f\n, mse_val, R(1,2)); residuals Y_test(:) - Y_pred(:); figure; subplot(1,2,1); scatter(Y_test(:), Y_pred(:), 10, filled); hold on; plot([min(Y_test) max(Y_test)], [min(Y_test) max(Y_test)], r--); xlabel(真实值); ylabel(预测值); title(预测 vs 真实); subplot(1,2,2); histogram(residuals, 20); xlabel(残差); ylabel(频数); title(残差分布);R 值接近 1 说明线性相关性强但如果残差图呈现明显漏斗形或弯曲说明模型没有捕捉到某些非线性关系可能需要增加隐藏层或换传递函数。这一步是很多人跳过的但恰恰是判断“模型到底学没学到东西”的关键。4. 分类实例patternnet 与混淆矩阵4.1 从回归到分类改哪几个地方分类和回归的区别主要在输出层和损失函数。patternnet是 MATLAB 为分类设计的函数输出层默认用softmax损失函数是交叉熵。数据标签需要转成 one-hot 编码比如三分类的标签2要变成[0 1 0]。function [net, Y_onehot] build_classifier(X, labels, n_classes) % labels 是 1~n_classes 的整数向量 Y_onehot full(ind2vec(labels)); % 转成 one-hot每列一个样本 net patternnet([16, 8], trainscg); net.trainParam.epochs 500; net.trainParam.max_fail 15; net.performFcn crossentropy; endind2vec把整数索引转成稀疏的 one-hot 矩阵full转成稠密矩阵方便后续运算。trainscg是量化共轭梯度法内存占用比trainlm小适合分类任务中样本较多的情况。4.2 混淆矩阵分类问题不能只看准确率分类问题如果类别不平衡准确率会有欺骗性。比如 95% 的样本属于 A 类模型全预测 A 也能拿 95% 准确率。所以必须看混淆矩阵。Y_pred_onehot net(X_test); [~, Y_pred_label] max(Y_pred_onehot, [], 1); [~, Y_true_label] max(Y_test, [], 1); figure; plotconfusion(Y_test, Y_pred_onehot);plotconfusion会画出混淆矩阵对角线是正确分类非对角线是误分类。重点看两类一是某个类别被大量误判成另一类说明特征区分度不够二是整体准确率高但某一类召回率极低说明类别不平衡需要处理比如加权重或过采样。4.3 分类网络的输出概率怎么用patternnet的输出是每个类别的概率max取最大值对应的索引就是预测类别。但概率值本身也有用如果某个样本的最大概率只有 0.4说明模型不确定这种样本在实际部署中应该交给人工复核或拒绝预测。max_prob max(Y_pred_onehot, [], 1); uncertain_idx find(max_prob 0.6); fprintf(不确定样本数: %d / %d\n, numel(uncertain_idx), numel(max_prob));这个技巧在工业质检、医疗辅助等场景很实用。模型不是非要给出一个答案承认“不确定”往往比强行预测更安全。5. 避坑与排查BP 训练中最容易翻车的五个地方5.1 现象训练误差一直不下降曲线几乎水平原因通常有三个学习率太小、数据没有归一化、或者网络初始化到了平坦区域。先检查数据范围如果特征值跨度超过两个数量级归一化基本能解决。如果归一化后仍然不降把学习率调大一个数量级试试trainlm对学习率不敏感但trainscg和traingd敏感。最后可以换随机种子多跑几次排除初始化运气问题。5.2 现象训练集误差很低测试集误差很高这是典型的过拟合。解决顺序是先增加数据量如果做不到就减少隐藏层神经元或层数再增大max_fail让早停更早触发还可以加正则化。MATLAB 的feedforwardnet支持net.performParam.regularization参数设成 0.01 到 0.1 之间通常有效。net.performParam.regularization 0.05;5.3 现象每次运行结果都不一样无法复现原因是随机种子没有固定。权重初始化、数据划分、甚至某些训练算法内部都有随机性。在脚本开头加rng(42)只能固定一部分如果用了并行训练还需要设置net.trainParam.showWindow false并确保并行流不引入额外随机。最稳妥的做法是保存训练好的net和tr下次直接加载。5.4 现象报错“Inputs and targets have different numbers of samples”这个错误几乎总是数据朝向问题。MATLAB 神经网络工具箱要求输入矩阵是特征数×样本数而很多数据文件是样本数×特征数。检查size(X)和size(Y)如果第一个维度是样本数就需要转置。转置后还要确认Y的维度是输出数×样本数分类任务中Y是 one-hot 矩阵回归任务中Y是1×样本数。5.5 现象训练速度极慢风扇狂转先看网络规模。如果隐藏层神经元总数超过几百个trainlm会因为计算 Jacobian 矩阵而变得很慢。换成trainscg或trainrp通常能缓解。另外检查是否误开了并行训练但没有并行工具箱这会导致反复报错重试。最后如果数据量很大考虑用miniBatchSize做小批量训练而不是全量梯度下降。6. 进阶技巧用程序包做超参数搜索与结果固化6.1 写一个简单的网格搜索脚本程序包里的实例通常只给一组参数但实际项目中你需要知道哪组参数更好。下面是一个最小网格搜索遍历隐藏层神经元数和学习率用验证集 MSE 选最优。hidden_list {[8], [12], [16], [12 8], [16 8]}; lr_list [0.001, 0.01, 0.05]; results []; for i 1:numel(hidden_list) for j 1:numel(lr_list) net feedforwardnet(hidden_list{i}, trainscg); net.trainParam.lr lr_list(j); net.trainParam.epochs 500; net.trainParam.showWindow false; [net, tr] train(net, X_train, Y_train); val_mse tr.vperf(tr.best_epoch); results [results; i, j, val_mse]; fprintf(hidden%s, lr%.3f, val_mse%.6f\n, ... mat2str(hidden_list{i}), lr_list(j), val_mse); end end [~, best_idx] min(results(:,3)); fprintf(最优组合: hidden%s, lr%.3f\n, ... mat2str(hidden_list{results(best_idx,1)}), lr_list(results(best_idx,2)));这个脚本的关键是net.trainParam.showWindow false否则每训练一次弹一个窗口几十次下来桌面全是窗口。tr.vperf(tr.best_epoch)取验证集在早停点的误差比取最后一轮的误差更合理。6.2 把训练好的网络和归一化参数一起保存模型部署时网络权重和归一化参数必须一起保存否则新数据无法正确变换。我一般会存一个结构体。model.net net; model.ps ps; model.input_size size(X_train, 1); model.output_size size(Y_train, 1); save(trained_model.mat, model);推理时先加载model用model.ps对新数据做同样的归一化再调用model.net。这一步看起来简单但很多“训练时好好的部署后结果全错”的问题根源就是归一化参数丢失或用了测试集重新计算。6.3 用交叉验证代替单次划分如果数据量不大单次划分的评估结果波动会很大。crossval函数可以做 k 折交叉验证但和神经网络工具箱配合时需要手动循环。一个实用的折中做法是重复 5 次随机划分每次记录测试集 MSE最后取均值和标准差。标准差大说明模型不稳定需要简化网络或增加数据。mse_list zeros(5,1); for k 1:5 rng(k); [net, tr] train(net, X_train, Y_train); Y_pred net(X_test); mse_list(k) perform(net, Y_test, Y_pred); end fprintf(MSE 均值 %.6f标准差 %.6f\n, mean(mse_list), std(mse_list));这个习惯我坚持了很多年。单次结果好看不代表模型可靠标准差才是稳定性的照妖镜。如果标准差超过均值的 20%说明模型对数据划分太敏感这时候与其继续调参不如回头检查数据质量或增加样本。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

一家制造企业的AI搜索可见度修复:GEO如何让数字资产被大模

一家制造企业的AI搜索可见度修复:GEO如何让数字资产被大模

一、企业数字资产的GEO价值的四个常见问题不少制造类企业发现,官网、产品手册、资质文件这些数字资产在传统搜索引擎里还有排名,但用户转向豆包、DeepSeek、文心一言提问时,品牌却几乎不被提及。第一个问题由此产生:企业积累多年的…

2026/10/12 17:57:26 阅读更多 →
手写递归下降语法分析器:从FIRST/FOLLOW到collegevm5实战

手写递归下降语法分析器:从FIRST/FOLLOW到collegevm5实战

简介:本资源是一份面向高校计算机专业学生与编译原理初学者的语法分析器实践项目,聚焦编译器前端核心环节——语法分析的C实现,助力理解词法到语法结构的转换逻辑及上下文无关文法的实际应用。压缩包为ZIP格式,仅含1个关键文件&am…

2026/10/12 17:57:25 阅读更多 →
Kubernetes监控实战:Metrics Server与Dashboard部署全解析

Kubernetes监控实战:Metrics Server与Dashboard部署全解析

搞Kubernetes运维的朋友应该都有这种经历:集群跑起来了,Pod也在转,但是你想看看每个节点还剩多少内存、某个应用最近半小时CPU是不是飙了,却发现无从下手。直接kubectl top node敲下去,报错说metrics API不可用&#x…

2026/10/12 17:57:25 阅读更多 →

最新新闻

89C52单片机驱动旋转LED的POV显示原理与实战

89C52单片机驱动旋转LED的POV显示原理与实战

1. 项目概述:为什么旋转LED至今仍是单片机入门的“试金石”你有没有在科技展会、校园创新实验室,甚至某家咖啡馆的角落里,见过那种悬空漂浮、自带呼吸感的LED文字?它没有屏幕,却能清晰显示“HELLO”“2024”甚至简单动…

2026/10/12 19:29:10 阅读更多 →
AM5平台ECC支持真相:静默SEC-DED与固件门禁机制解析

AM5平台ECC支持真相:静默SEC-DED与固件门禁机制解析

1. 为什么AM5平台的ECC支持成了“薛定谔的猫”?在某实验室搭建一套用于长期数据校验的计算节点时,我遇到一个典型困境:手头有块华硕ROG STRIX X670E-E GAMING WIFI主板、一颗锐龙7 7800X3D处理器,以及几条标称支持ECC的DDR5内存。…

2026/10/12 19:29:10 阅读更多 →
DMA总读旧数据?CPU与Cache一致性问题的三种解决策略

DMA总读旧数据?CPU与Cache一致性问题的三种解决策略

做DMA相关开发久了,迟早会遇到这么个诡异的现象:代码明明先把新数据写到了缓冲区,DMA把数据搬出去,接收端拿到的却是上一批内容。反过来也一样,DMA搬进来一批数据,CPU读到的偏偏是改动前的旧值。我最近在某…

2026/10/12 19:29:10 阅读更多 →
smart-doc + showdoc:接口文档自动化生成与协作管理实战

smart-doc + showdoc:接口文档自动化生成与协作管理实战

1. 接口文档管理的痛点与方案选型但凡带过团队、跟过中大型项目的人,大概都经历过接口文档那点糟心事。后端改了一个字段类型,前端拿着三天前的文档联调,结果字段对不上,两边互相甩锅;测试同学照着文档写用例&#xff…

2026/10/12 19:29:09 阅读更多 →
基于机器学习的URL恶意性检测系统落地实践与踩坑指南

基于机器学习的URL恶意性检测系统落地实践与踩坑指南

简介:一套基于机器学习的URL恶意性检测系统,通过提取URL字符串自身特征并结合sklearn库构建分类模型,用于识别网络钓鱼、恶意软件下载等恶意链接,适合网络安全学习者、算法工程师及数据挖掘爱好者参考与二次开发。压缩包内共24个文…

2026/10/12 19:28:08 阅读更多 →
Naoqi库函数深度解析:Python控制Nao机器人的核心技巧与避坑指南

Naoqi库函数深度解析:Python控制Nao机器人的核心技巧与避坑指南

1. 为什么naoqi这层封装值得单独拿出来聊很多人第一次接触Nao机器人,注意力都放在动作编排和外观上,觉得会调几个挥手、走路、说话的接口就算入门了。真正上手做项目才会发现,naoqi这套库函数才是决定项目能不能跑稳的关键。它本质上是一组运…

2026/10/12 19:28:08 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 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/11 10:45:37 阅读更多 →
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 阅读更多 →