BP神经网络函数逼近:Python实现、调参与故障排查
简介BP神经网络实现函数逼近是机器学习中的经典任务常用于处理非线性映射问题。这份PDF围绕BPBack Propagation网络的核心原理展开从拓扑结构、正向传播与反向传播推导到权重更新和梯度下降策略均有清晰讲解并给出以ysin(x)为逼近目标的完整实验流程与结果讨论适合机器学习初学者、课程作业参考者及需要快速理解BP算法细节的开发者阅读。资源为1个PDF文件大小345KB内容紧凑可随时查阅。目前已有102人学习下载。文档还针对固定学习率收敛慢、局部最小值、隐含层参数缺乏理论指导等常见缺陷进行了总结并提到动态学习率、附加动量、Adam优化等改进方向能帮助读者在掌握基础的同时避开典型陷阱对完成作业或入门神经网络实践均具有实用参考价值。1. BP神经网络做函数逼近老方法为什么至今没被替换如果你手头有一组离散的输入输出数据想找出背后那条连续曲线第一反应可能是多项式拟合或者插值。但数据一旦带噪声、曲线一旦变得复杂这些传统方法的边界就暴露了——多项式阶数高了过拟合低了欠拟合。BP 神经网络做函数逼近解决的正是这个问题它用一套统一的框架去拟合任意连续非线性函数不需要事先猜函数形式。这也是为什么量化策略研究、信号重构、传感器标定这些场景里到现在还有人翻出这份经典的 BP 实现来改改直接用。本篇我按自己落地这类任务的完整路径把原理、Python 实现、参数设置和踩过的坑一次讲清楚新手照着跑熟手可以直接跳到调参和排查部分。2. 函数逼近的原理与网络设计动手前先把这四件事定下来2.1 通用近似定理为什么三个层就够逼近大多数函数BP 神经网络做函数逼近的理论依据是通用近似定理一个单隐藏层的前馈网络只要隐藏层神经元数量足够多就能以任意精度逼近任意连续函数。这个结论听起来很诱人但实际用的时候要冷静一点——它只保证了“存在性”没告诉你需要多少个神经元也没保证训练能收敛到那个精度。我一般会先用单隐藏层起步因为 BP 反向传播在单隐藏层下最容易调试。隐藏层神经元个数按输入维度和目标函数的复杂度来定一维输入逼近一个平缓曲线10 到 20 个神经元足够如果目标函数有多个尖峰或者高频成分再往上加到 50 甚至 100。一个实用的经验值是把它设成输入维度的 5 到 10 倍然后观察训练集误差有没有下降到预期范围。网络层数的选择上两层隐藏层能表达更复杂的函数结构但训练难度会明显上升——梯度消失、局部最优、收敛变慢都会跟着来。做函数逼近不是做图像识别我不建议一上来就堆深度先把单隐藏层调到一个能用的精度再决定要不要加深。注意判断隐藏层够不够的标准是训练集损失不是测试集损失。训练集都降不下去说明网络容量不足先加神经元训练集降得好、测试集差才是过拟合该加正则化或早停。2.2 激活函数与损失函数逼近任务里的第一组分岔口函数逼近和分类任务在激活函数的选择上思路完全不同。输出层不能再用 sigmoid 或者 softmax因为逼近的目标值往往落在 [0, 1] 之外输出层必须用线性激活让网络能输出任意实数。隐藏层用 tanh 通常比 sigmoid 收敛更快因为 tanh 的输出均值接近 0有利于梯度流动。ReLU 在深度网络里表现好但在浅层逼近任务里有时会出现神经元死亡的问题神经元一旦输出恒为 0梯度就没了这个单元就废了。损失函数选均方误差 MSE 是这类任务的标准做法它对应着高斯噪声假设下的最大似然估计。MSE 对离群点比较敏感如果你的数据里有明显的异常尖峰可以换成 Huber 损失试试。我自己的习惯是先看数据数据干净用 MSE数据里存在明显的飞点就换 Huber。2.3 数据预处理输入输出都需要归一化很多人在 BP 函数逼近上翻车翻在最不起眼的数据预处理上。输入不归一化梯度更新时不同维度的量级差异会导致更新方向被大尺度特征主导输出不归一化损失值可能大到数值溢出的程度梯度算出来直接变成 NaN。我一般把输入和输出都线性映射到 [0, 1] 或者 [-1, 1] 区间。映射参数在训练集上计算测试集用同一组参数变换不能各自独立做。这个细节看起来简单但测试集单独归一化是新手最容易犯的错等于把测试集的分布信息提前泄漏给了模型。最后一步是数据集的划分。函数逼近任务里训练集和测试集必须是交错采样的不能把前一半当训练、后一半当测试——如果目标函数有周期性这种切分方式会让测试集恰好落在模型没见过的相位区间逼出很差的泛化效果。最稳妥的做法是随机打乱后按比例切分或者用拉丁超立方采样保证覆盖均匀。3. 用 Python 从零实现 BP 神经网络反向传播的三段核心代码3.1 网络骨架与参数初始化定义一个三层网络类做函数逼近没必要一上来就引入 PyTorch 或 TensorFlow用 NumPy 手写一个 BP 网络能把反向传播的每个环节看得清清楚楚调起参来也有底。下面这个类就是一个标准的三层网络输入层、隐藏层、输出层。import numpy as np class BPNetwork: def __init__(self, n_input, n_hidden, n_output, lr0.01): # 隐藏层权重和偏置 self.W1 np.random.uniform(-0.5, 0.5, (n_input, n_hidden)) self.b1 np.zeros((1, n_hidden)) # 输出层权重和偏置 self.W2 np.random.uniform(-0.5, 0.5, (n_hidden, n_output)) self.b2 np.zeros((1, n_output)) self.lr lr def tanh(self, x): return np.tanh(x) def tanh_deriv(self, x): return 1.0 - np.tanh(x) ** 2权重初始化范围取[-0.5, 0.5]而不是标准正态分布是为了避免初始梯度太大导致前几步训练直接发散。偏置初始化为 0 在这里没有问题因为 tanh 输出本身不是 0 对称的偏置会在训练过程中自动调整。学习率先给 0.01后面根据训练情况再改。提示如果输入维度比较高初始化的范围应该按 1/sqrt(n_input) 收缩这是 Xavier 初始化的简化版。对一维输入逼近任务固定范围初始化就够用。3.2 前向传播与损失计算逼近误差怎么度量前向传播就是把输入从输入层传到输出层中间经过加权求和与激活函数。输出层不激活直接输出线性组合的结果因为我们要逼近的是一个实数值不是概率。def forward(self, X): # 隐藏层加权求和后过 tanh self.z1 np.dot(X, self.W1) self.b1 self.a1 self.tanh(self.z1) # 输出层线性输出不做激活 self.z2 np.dot(self.a1, self.W2) self.b2 return self.z2 def compute_loss(self, y_true, y_pred): # 均方误差取平均而不是求和 m y_true.shape[0] loss np.mean((y_true - y_pred) ** 2) return lossMSE 取平均而不是求和是为了让损失值跟样本量无关方便在不同数据集规模之间对比。如果你取求和1000 个样本的损失天然就是 100 个样本的 10 倍容易误判模型变差了。还有一种常见的做法是除以 2纯粹为了求导方便MSE 求导后系数正好抵消但用 NumPy 手写时这个优化没什么意义直接取平均最简单。3.3 反向传播与梯度更新核心的链式法则实现反向传播是整个 BP 网络的核心。对输出层来说梯度等于误差直接乘上隐藏层输出的转置对隐藏层来说梯度要从输出层传回来乘上 tanh 的导数。这段代“写错一个符号就全盘皆输”的地方值得逐行核对自己的维度。def backward(self, X, y_true, y_pred): m X.shape[0] # 输出层误差预测值与真实值的差 d_z2 y_pred - y_true # 输出层梯度 d_W2 np.dot(self.a1.T, d_z2) / m d_b2 np.sum(d_z2, axis0, keepdimsTrue) / m # 反向传播到隐藏层乘上 tanh 的导数 d_a1 np.dot(d_z2, self.W2.T) d_z1 d_a1 * self.tanh_deriv(self.z1) # 隐藏层梯度 d_W1 np.dot(X.T, d_z1) / m d_b1 np.sum(d_z1, axis0, keepdimsTrue) / m return d_W1, d_b1, d_W2, d_b2 def update(self, d_W1, d_b1, d_W2, d_b2): self.W1 - self.lr * d_W1 self.b1 - self.lr * d_b1 self.W2 - self.lr * d_W2 self.b2 - self.lr * d_b2维度检查是这段代码最容易出错的地方X形状是(m, n_input)W1是(n_input, n_hidden)z1是(m, n_hidden)a1和W2相乘后z2是(m, n_output)。如果某个梯度矩阵的形状传错了NumPy 有时候不报错而是直接广播导致梯度更新到错误的位置损失曲线表现为“先降后横盘偶尔跳一下”。4. 完整训练流程与可视化验证逼近一条非线性的正弦曲线4.1 生成带噪声的样本数据目标函数与采样策略我用一个带噪声的正弦函数做目标因为它的非线性足够明显逼近效果也容易用肉眼判断。样本数取 500 个输入在 [-2π, 2π] 上均匀采样输出加上 0.05 幅度的高斯噪声。这个噪声量模拟了真实传感器数据的情况不至于让逼近任务变得不可解。import numpy as np import matplotlib.pyplot as plt np.random.seed(42) X np.random.uniform(-2 * np.pi, 2 * np.pi, (500, 1)) y np.sin(X) 0.05 * np.random.randn(500, 1)采样策略上均匀随机采样比等间距采样更稳因为等间距采样在周期性函数上容易让模型记住采样位置而不是函数本身。随机种子的设置一开始就要做好不然训练到一半发现效果不错却怎么也复现不出来。4.2 训练循环学习率、迭代次数与损失曲线监控训练循环的核心是按上面定义的类走前向传播、算损失、反向传播、更新参数。在函数逼近这个场景下批量梯度下降就够了不需要小批量。500 个样本一次性算梯度梯度的估计方差小收敛曲线比小批量更平滑对调参更友好。# 归一化到 [-1, 1] X_min, X_max X.min(), X.max() y_min, y_max y.min(), y.max() X_norm 2 * (X - X_min) / (X_max - X_min) - 1 y_norm 2 * (y - y_min) / (y_max - y_min) - 1 net BPNetwork(1, 20, 1, lr0.05) epochs 5000 loss_history [] for epoch in range(epochs): y_pred net.forward(X_norm) loss net.compute_loss(y_norm, y_pred) d_W1, d_b1, d_W2, d_b2 net.backward(X_norm, y_norm, y_pred) net.update(d_W1, d_b1, d_W2, d_b2) loss_history.append(loss) if epoch % 500 0: print(fepoch {epoch}, loss: {loss:.6f})输入和输出都归一化到 [-1, 1]是这段代码里最关键的一步。学习率取 0.05 对这个任务足够大5000 次迭代后损失能降到 0.01 以下。如果发现损失在 0.05 附近就降不动了优先检查归一化是不是出了问题而不是急着改网络结构。4.3 可视化逼近效果把拟合曲线和真实曲线叠在一起看训练结束后把网络在整个输入区间上的预测值反归一化回原始尺度画出来和真实函数对比。这一步能直观看出逼近在哪些区域失败是调参最重要的诊断手段。X_plot np.linspace(-2 * np.pi, 2 * np.pi, 1000).reshape(-1, 1) X_plot_norm 2 * (X_plot - X_min) / (X_max - X_min) - 1 y_plot_norm net.forward(X_plot_norm) y_plot (y_plot_norm 1) / 2 * (y_max - y_min) y_min plt.figure(figsize(10, 5)) plt.scatter(X, y, s2, alpha0.4, labeltraining data) plt.plot(X_plot, y_plot, r-, labelBP approximation) plt.plot(X_plot, np.sin(X_plot), g--, labeltrue function) plt.legend() plt.show()看这张图时我习惯先看两端输入区间的边界处是逼近最容易跑偏的位置因为样本稀疏模型没有足够的信息约束边界行为。如果两端出现明显的偏离说明采样范围还不够或者网络容量不够如果中间出现波纹状抖动说明过拟合了噪声。5. BP 函数逼近常见故障排查五个坑和对应的解法5.1 现象损失不降反升或者一路 NaN原因学习率过大导致梯度更新步长超过了损失函数的“安全区”参数在最优值附近来回震荡振幅越来越大最后数值溢出变成 NaN。另一个常见原因是权重初始化范围过大比如用np.random.randn初始化初始梯度就可能大得离谱。解决先把学习率降到 0.001 量级重跑一遍确认损失能下降后再逐步增大同时把初始化范围改回[-0.5, 0.5]或者按1/sqrt(n_input)缩放。如果已经出现 NaN别在 NaN 的基础上调整直接重新初始化网络再训练。5.2 现象逼近结果是一条直线完全不贴合目标函数原因网络退化。最典型的是隐藏层用了 ReLU多个神经元在训练过程中输出恒为 0梯度永远为 0整个隐藏层变成线性变换网络等效于一个线性回归模型。另一个原因是初始权重全为 0导致所有神经元同步更新永远学不出非线性结构。解决隐藏层换回 tanh 激活把权重初始化改成随机均匀分布确认每个神经元的输入范围不在饱和区。打印隐藏层输出a1的标准差如果标准差接近 0说明所有神经元都饱和了需要减小初始化范围或者改用批归一化。5.3 现象训练集损失很低但测试集上逼近效果很差原因过拟合。网络记住了训练样本的噪声而不是函数本身的形状。对小规模数据集这是最常见的问题函数逼近任务尤其容易发生因为数据量本来就不大。解决三层手段按顺序使用——增大训练样本量从 500 加到 2000隐藏层神经元从 20 减到 10 附近最后再加 L2 正则化在损失函数里追加一项lambda * (np.sum(W1**2) np.sum(W2**2))lambda从 0.001 开始试。还有一个容易被忽略的办法使用早停在测试集损失连续 200 个 epoch 不下降时停止训练保存当前模型。5.4 现象训练初期损失剧烈震荡后面才勉强收敛原因输入输出没有归一化到统一量纲。比如输入范围是 [-6, 6]输出范围是 [-1, 1]两个量级相差 6 倍梯度在不同维度上的尺度就不一致优化路径会走“之字形”。这在手写 BP 网络里尤其明显因为不像深度学习框架那样自动做归一化。解决训练前固定好归一化参数输入和输出都映射到 [-1, 1]。我在实践中发现归一化处理得当的情况下学习率可以从 0.01 提高到 0.1 而不发散收敛速度提升非常明显。5.5 现象同一份代码跑两次结果差别很大原因没有固定随机种子。权重初始化和数据采样都带随机性两次训练的起点不同最终收敛到的局部最优也不同。这在函数逼近任务里不一定是坏事但如果想复现某个实验结果、对比不同参数的效果就必须固定住随机源。解决在文件开头统一设置np.random.seed(固定值)同时把数据采样的随机种子也固定。如果做多组实验对比每组实验用不同随机种子跑 5 次取平均比单次运行的结果更可靠。注意np.random.seed只影响 NumPy 的全局随机状态如果你的代码里混用了 Python 内置的random模块需要单独给它设种子两个随机源互不相关。6. 逼近效果再进阶早期停止、多网络集成与边界行为验证基础训练跑通之后想让逼近效果再上一个台阶我常用的手段有三个。第一个是早停加模型保存。训练过程中每隔 100 个 epoch 在单独的验证集上算一次损失当验证集损失连续 200 个 epoch 不再下降时把当前网络参数保存下来作为最终模型。注意要在验证损失最低点保存而不是在训练结束时保存因为训练后期模型在往“记住噪声”的方向走。第二个是多网络集成。用不同的随机种子训练 5 个结构相同但初始化不同的 BP 网络预测时取 5 个网络输出的平均值。这个做法在函数逼近任务里比单网络稳定很多——单个网络可能在不同局部最优之间摇摆集成平均能把这些波动平滑掉。代价是训练时间变成 5 倍但对小规模逼近任务来说完全可接受。第三个是边界行为的专门验证。函数逼近最容易在采样区间两端失效训练完后一定要把输入范围向外延展 20% 看一下预测曲线如果两端出现明显的上扬或下垂说明网络在边界外没有约束能力实际使用时需要把输入裁剪到训练区间内或者调整采样策略让边界区域有更多样本点。我之前在一个传感器标定项目里就是靠这三招把逼近误差从 0.03 压到了 0.012。最有体感的教训是BP 函数逼近的误差下限不取决于网络有多复杂而取决于你对边界条件和噪声分布的理解够不够深。希望这篇能帮你把这条路走顺省下我当年反复调参的那几个晚上。祝顺利。本文还有配套的精品资源点击获取

相关新闻

PCA9422+PIC18F87J50双芯片电源管理方案设计

PCA9422+PIC18F87J50双芯片电源管理方案设计

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

2026/10/10 4:52:21 阅读更多 →
东南大学编译原理实验:Java实现词法分析到目标代码生成全流程

东南大学编译原理实验:Java实现词法分析到目标代码生成全流程

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

2026/10/10 4:52:21 阅读更多 →
TM4C129LNCZAD + PCA9422:电池供电设备的PMIC电源管理设计实践

TM4C129LNCZAD + PCA9422:电池供电设备的PMIC电源管理设计实践

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

2026/10/10 4:52:21 阅读更多 →

最新新闻

PCA9422与PIC24FJ256GA110嵌入式电源管理实战设计

PCA9422与PIC24FJ256GA110嵌入式电源管理实战设计

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

2026/10/10 5:34:36 阅读更多 →
@vue/apollo-composable useFragment Result 返回结构详解:读懂片段读取的完整状态语义

@vue/apollo-composable useFragment Result 返回结构详解:读懂片段读取的完整状态语义

前端GraphQL 【免费下载链接】apollo 🚀 Apollo/GraphQL integration for VueJS 项目地址: https://gitcode.com/gh_mirrors/apollo2/apollo 点击查看 免费下载 useFragment 是 Vue Apollo 组合式 API 中用于从 Apollo 缓存读取 GraphQL 片段数据并保持…

2026/10/10 5:34:36 阅读更多 →
在线教育平台技术选型攻略:BS架构下SpringBoot与Vue3实战

在线教育平台技术选型攻略:BS架构下SpringBoot与Vue3实战

讲真,在线教育平台的技术选型没你想的那么复杂做在线教育平台这些年,我见过太多团队在技术选型上反复横跳。今天拿真金白银换来的经验说个透:不管你是刚起步的个人开发者,还是要给公司搭一套正式的在线教育系统,BS架构…

2026/10/10 5:34:36 阅读更多 →
stylelint-polaris media-query-allowed-list 插件:用 Polaris 断点别名统一媒体查询规范

stylelint-polaris media-query-allowed-list 插件:用 Polaris 断点别名统一媒体查询规范

前端UI组件 【免费下载链接】polaris-react-archive Shopifys Polaris Design System - React implementation (Deprecated) 项目地址: https://gitcode.com/gh_mirrors/po/polaris-react-archive 点击查看 免费下载 导读 media-query-allowed-list 是 Shopify Po…

2026/10/10 5:34:36 阅读更多 →
BFE AI 访问日志可观测字段升级实战:`bfe-access-pb` 协议对齐与 `ai_*` 新字段采集改造

BFE AI 访问日志可观测字段升级实战:`bfe-access-pb` 协议对齐与 `ai_*` 新字段采集改造

后端网络/通信云原生 【免费下载链接】bfe A modern layer 7 load balancer from baidu 项目地址: https://gitcode.com/gh_mirrors/bf/bfe 点击查看 免费下载 本文以 BFE 开源仓库(Go 语言实现的七层负载均衡器)中 AI 网关能力为背景&#…

2026/10/10 5:34:36 阅读更多 →
内存涨价周期下,为什么32GB反而成了装机标配?

内存涨价周期下,为什么32GB反而成了装机标配?

1. 内存涨价周期里,装机单上的容量数字为什么反而越写越大这两年但凡自己动手装过机、或者帮朋友写过配置单的人,应该都有一个很直观的感受:内存条的价格是真的不便宜了。前两年还能用相对轻松的价格拿下一套大容量套条,现在再去询…

2026/10/10 5:33:35 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

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

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

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

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

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

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 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/10 5:23:50 阅读更多 →
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/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练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/9 6:17:20 阅读更多 →