BP神经网络手写数字识别:一套可直接运行的Python实现与调参指南
简介BP神经网络预测模型的 Python 实现聚焦手写体数字识别任务。项目基于反向传播算法搭建多层前馈网络面向机器学习初学者与 OCR 场景爱好者适合希望掌握神经网络训练、权重保存和模型评估全流程的读者。压缩包共 4 个文件、约 1.17MB包括 2 个 Python 脚本和 2 个 pickle 权重文件脚本分别用于模型实现与预测测试pickle 文件保存训练后的权值和偏置加载后可直接复用模型整体结构简洁、便于快速上手。目前已有 815 人学习浏览说明其实用性受到认可。读者可从中获得完整的 BP 网络代码框架、已训练好的权重参数以及基于测试集评估识别率的具体示例结合源码与权重文件既能快速验证手写数字分类效果也能通过阅读代码理解前向传播、反向传播、参数更新等关键环节为后续优化网络结构或迁移至其他图像识别任务打下基础。1. BP神经网络手写体数字识别一套能直接跑的 Python 实现手写体数字识别是 BP 神经网络最经典的入门实战很多人学完理论卡在第一步权重怎么存、模型怎么复用、识别率怎么算。这份资源把整个闭环都补齐了neuralNetwork.py负责网络实现testwork.py负责测试两个 pickle 文件直接存好训练完的权重加载即用不用等训练跑完才能看效果。项目基于 MNIST 数据集训练集 60000 张、测试集 10000 张每张 28×28 像素适合想从理论跨到可运行代码的 Python 开发者也适合需要一套最小实现做 baseline 对比的算法工程师。我拆完这份代码后最大的感受是BP 网络的核心不在公式多复杂而在权重怎么初始化、误差怎么反传、参数怎么调这套实现正好把这三件事都落到了具体代码上。2. 网络结构与反向传播为什么 784-100-10 就够了2.1 三层结构的输入、隐藏与输出设计BP 神经网络处理 MNIST 手写数字时输入层节点数由图像像素决定。MNIST 每张图是 28×28 的灰度图拉平后是 784 个像素值所以输入层节点数是 784。输出层对应 10 个类别数字 0 到 9节点数就是 10。中间的隐藏层节点数没有绝对标准常见做法是先取一个经验值比如 100 或 128再做对比实验。节点太少拟合能力不够识别率上不去节点太多容易过拟合训练时间成倍增加。这份资源里neuralNetwork.py的网络结构就是典型的 784-100-10即输入层 784 个节点、隐藏层 100 个节点、输出层 10 个节点。隐藏层节点数选 100 在 MNIST 任务上是性价比很高的选择训练速度快识别率也能稳定在 95% 以上。权重和偏置是网络的关键参数训练过程就是不断更新它们让损失函数逐渐下降。2.2 激活函数与权重初始化策略隐藏层和输出层使用不同的激活函数。常见做法是隐藏层用 Sigmoid 函数把输入压缩到 0 到 1 之间输出层也用 Sigmoid 或 Softmax但在这个项目里输出层同样用 Sigmoid配合误差公式计算输出差值。权重初始化一般用随机小数范围在 -0.5 到 0.5 之间这样每个神经元初始输出不会太大网络能正常启动训练。代码里生成权重的写法通常是numpy.random.rand(n, m) - 0.5numpy.random.rand生成 0 到 1 的均匀分布随机数减去 0.5 后范围就变成了 -0.5 到 0.5。偏置初始化可以设为 0因为权重已经提供了随机性偏置只需要在训练中被梯度带动调整即可。import numpy as np # 输入层、隐藏层、输出层节点数 input_nodes 784 hidden_nodes 100 output_nodes 10 # 权重随机初始化范围 -0.5 到 0.5 wih np.random.rand(hidden_nodes, input_nodes) - 0.5 who np.random.rand(output_nodes, hidden_nodes) - 0.5 # 偏置初始化通常设为 0 bih np.zeros((hidden_nodes, 1)) bho np.zeros((output_nodes, 1))这段代码是网络初始化的核心wih是输入层到隐藏层的权重矩阵维度是 100×784who是隐藏层到输出层的权重矩阵维度是 10×100。用均匀分布随机初始化是为了打破对称性如果所有权重都设成同一个值反向传播时对称神经元会同步更新网络无法学到不同特征。偏置全部初始化为 0 是安全的训练开始后梯度会自然把它调整到合适位置。2.3 前向传播与误差反向传播的核心逻辑前向传播的计算链路是固定的输入层数据先乘隐藏层权重加上偏置过激活函数得到隐藏层输出再乘输出层权重加上偏置再过激活函数得到最终输出。整个过程可以用矩阵运算一次性完成这也是为什么代码里推荐用numpy而不是纯 Python 循环矩阵运算能极大提升执行效率。def forward_pass(inputs): # 输入层到隐藏层 hidden_input np.dot(wih, inputs) bih hidden_output 1 / (1 np.exp(-hidden_input)) # 隐藏层到输出层 final_input np.dot(who, hidden_output) bho final_output 1 / (1 np.exp(-final_input)) return hidden_output, final_outputnp.dot(wih, inputs)是矩阵乘法把 784 维输入映射到 100 维隐藏层空间。1 / (1 np.exp(-x))是 Sigmoid 函数它把任意实数压缩到 0 到 1 区间。Sigmoid 可导导数形式很简洁是反向传播能顺利计算梯度的前提。反向传播的思路是先计算输出层误差即真实标签和预测值的差再把误差从输出层传回隐藏层逐层更新权重。输出层误差的计算方式是(目标值 - 实际输出) * sigmoid导数隐藏层误差是输出层误差与输出层权重的加权和 * 隐藏层sigmoid导数。权重更新公式是权重 学习率 * 误差 * 上一层输出这个更新量本质是梯度的负方向。learning_rate 0.1 # 输出层误差 output_errors targets - final_output hidden_errors np.dot(who.T, output_errors) # 权重更新 who learning_rate * np.dot(output_errors * final_output * (1 - final_output), hidden_output.T) wih learning_rate * np.dot(hidden_errors * hidden_output * (1 - hidden_output), inputs.T)这里final_output * (1 - final_output)是 Sigmoid 函数的导数它保证梯度大小在神经元饱和时趋向于 0。学习率learning_rate控制每次更新的步长太大会导致损失震荡不收敛太小则训练速度极慢。3. 训练流程与模型持久化从原始 MNIST 到可用权重3.1 neuralNetwork.py 的模块结构与代码拆解neuralNetwork.py是这份资源的核心文件它把网络定义、训练、查询三个功能封装成一个类。类的初始化方法接收输入层、隐藏层、输出层节点数和学习率然后生成三组矩阵输入层到隐藏层的权重、隐藏层到输出层的权重、以及对应的偏置。训练方法train接收输入数据和目标值先做一次前向传播得到实际输出再计算误差并更新权重。查询方法query只做前向传播用于推理预测。class NeuralNetwork: def __init__(self, input_nodes, hidden_nodes, output_nodes, learning_rate): self.inodes input_nodes self.hnodes hidden_nodes self.onodes output_nodes self.lr learning_rate self.wih np.random.rand(self.hnodes, self.inodes) - 0.5 self.who np.random.rand(self.onodes, self.hnodes) - 0.5 self.bih np.zeros((self.hnodes, 1)) self.bho np.zeros((self.onodes, 1)) def train(self, inputs_list, targets_list): # 转成列向量方便矩阵乘法 inputs np.array(inputs_list, ndmin2).T targets np.array(targets_list, ndmin2).T # 前向传播 hidden_output self._sigmoid(np.dot(self.wih, inputs) self.bih) final_output self._sigmoid(np.dot(self.who, hidden_output) self.bho) # 反向传播 output_errors targets - final_output hidden_errors np.dot(self.who.T, output_errors) self.who self.lr * np.dot(output_errors * final_output * (1 - final_output), hidden_output.T) self.wih self.lr * np.dot(hidden_errors * hidden_output * (1 - hidden_output), inputs.T) def query(self, inputs_list): inputs np.array(inputs_list, ndmin2).T hidden_output self._sigmoid(np.dot(self.wih, inputs) self.bih) final_output self._sigmoid(np.dot(self.who, hidden_output) self.bih) return final_output def _sigmoid(self, x): return 1 / (1 np.exp(-x))np.array(inputs_list, ndmin2).T把输入数据转成列向量这一步很关键。如果输入是形状为(784,)的一维数组直接做矩阵乘法会得到错误结果转成(784, 1)列向量后np.dot(self.wih, inputs)的结果才是(100, 1)后续计算维度才不会乱。目标值targets_list同样转成列向量长度为 10对应数字 0 到 9目标数字的位置是 1其余位置是 0。3.2 训练数据集预处理与标签编码方法MNIST 原始数据不能直接喂给网络需要做归一化和标签编码。图像像素值范围是 0 到 255如果不做缩放大的数值会让 Sigmoid 函数迅速饱和梯度趋近于 0训练几乎停滞。常见做法是把像素值除以 255缩放到 0 到 1 区间也可以再做平移让均值接近 0.5加速收敛。标签编码有两种选择。第一种是直接使用 0 到 9 的数字作为目标值输出层只有一个节点但这隐含了数字之间的顺序关系模型会倾向于学习「8 比 3 大」这种错误信息。第二种是独热编码输出层 10 个节点目标数字对应位置设为 1其余位置设为 0.x1。对于手写数字识别任务独热编码是标准做法因为它不引入不存在的顺序关系。def prepare_input(image_array): # 归一化像素值到 0.01~1.0避免 0 和 1 的极端边界 return (image_array / 255.0 * 0.99) 0.01 def encode_label(label): targets np.zeros(output_nodes) 0.01 targets[label] 0.99 return targets归一化时把范围从 0 到 1 调整为 0.01 到 1.0是训练神经网络的一个常用技巧。Sigmoid 输出的理论范围是 0 到 1实际训练中如果目标值精确等于 0 或 1权重会被推向无穷大导致网络不稳定。用 0.01 和 0.99 做软目标既保留了正确的梯度方向又避免了数值溢出。3.3 训练主循环与参数设置建议训练主循环负责读取数据、调用train方法、统计识别率。推荐把数据分成批次每个批次大小 10 到 100 张批量训练比单张训练更稳定也能提升计算效率。但要注意这个网络实现用的是随机梯度下降的简化版本权重更新一次只针对一个样本批次处理时需要对梯度做平均。epochs 5 batch_size 100 for epoch in range(epochs): for batch_start in range(0, len(train_data), batch_size): batch_end batch_start batch_size for image, label in train_data[batch_start:batch_end]: inputs prepare_input(image) targets encode_label(label) nw.train(inputs, targets) print(fEpoch {epoch1} done)epochs是训练轮数每一轮完整遍历一次训练集。轮数太少欠拟合识别率偏低轮数太多容易过拟合验证集识别率反而下降。MNIST 上用 100 个隐藏层节点通常训练 3 到 5 轮就能获得 95% 左右识别率继续增加轮数收益有限。batch_size影响更新频率和稳定性小批量收敛快但噪声大大批量平滑但可能陷入局部最优。3.4 权重持久化到 pickletrain 与 query 的完整流程训练完成后权重和偏置需要保存到文件这样下次使用时加载文件就能直接预测省去重新训练的等待时间。testwho.pickle和testwih.pickle就是干这件事的。用 pickle 保存numpy数组特别方便pickle.dump可以把对象序列化写入文件pickle.load可以恢复对象。import pickle # 保存权重 with open(testwih.pickle, wb) as f: pickle.dump(nw.wih, f) with open(testwho.pickle, wb) as f: pickle.dump(nw.who, f) # 加载权重 with open(testwih.pickle, rb) as f: loaded_wih pickle.load(f) with open(testwho.pickle, rb) as f: loaded_who pickle.load(f)注意保存和加载都要使用二进制模式wb和rb缺一不可。pickle 保存了完整的numpy数组结构和数据类型加载后可以直接用于矩阵运算。这份资源里testwork.py的角色就是加载testwho.pickle和testwih.pickle里的权重对测试集做前向传播统计正确识别数量并计算识别率。# 测试脚本核心逻辑 with open(testwih.pickle, rb) as f: wih pickle.load(f) with open(testwho.pickle, rb) as f: who pickle.load(f) correct_count 0 total_count 0 for image, label in test_data: image_array prepare_input(image) hidden 1 / (1 np.exp(-(np.dot(wih, image_array) bih))) output 1 / (1 np.exp(-(np.dot(who, hidden) bho))) predicted np.argmax(output) if predicted label: correct_count 1 total_count 1 accuracy correct_count / total_count print(f识别率: {accuracy:.4f})np.argmax(output)返回输出向量中最大值对应的下标这个下标就是网络预测的数字。例如输出向量的第 7 个元素最大就预测这个手写数字是 6。识别率是正确分类样本数占总样本数的比例在 MNIST 测试集上这个网络结构配合合理参数通常能达到 95% 以上具体数值因权重初始化和训练参数不同略有波动。4. 避坑指南BP 网络常见问题与排查经验4.1 权重矩阵维度不匹配矩阵乘法报错现象运行np.dot(self.wih, inputs)时抛出ValueError: shapes not aligned。原因输入数据的形状不是预期的(784, 1)列向量可能传入了一维数组(784,)或行向量(1, 784)。解决在进入矩阵运算前统一用np.array(..., ndmin2).T转成列向量。这个坑我在第一次跑项目时踩过以为是数据读取问题实际是维度形状没对齐。4.2 使用 pickle 加载权重失败或预测全乱现象testwork.py加载 pickle 文件时报错EOFError或者加载成功但识别率极低。原因pickle 文件路径不对、文件被损坏或者训练时保存的权重与加载后的权重矩阵维度不一致。解决检查 pickle 文件是否存在于当前目录确认文件大小不是 0 字节加载后打印np.shape(wih)验证维度是否为(100, 784)。有一次我换了环境重新跑忘记把 pickle 文件复制过去程序能跑但识别率只有 10% 左右排查了半天才发现是文件缺失。4.3 隐藏层节点数与输入维度对不上现象修改隐藏层节点数后训练正常但保存的权重加载时矩阵乘法报错。原因neuralNetwork.py里的隐藏层节点数是写死的改了一个地方没改另一个地方比如网络结构改成 128 个隐藏节点但保存权重的代码还是用的 100。解决所有涉及维度的地方要统一包括类初始化的hidden_nodes、保存权重文件的nw.wih、加载权重后定义bih的形状。更稳妥的做法是从权重的实际形状反推节点数而不是硬编码。4.4 训练时间过长且识别率不升反降现象epoch 数增加到 20 以上识别率反而从 96% 降到 92%。原因过拟合网络把训练集中的噪声细节也学进去了在测试集上泛化能力下降。解决把训练集拆出一部分做验证集每次训练完用验证集评估识别率找到最佳 epoch 数后固定住。我一般是训练 5 轮后每轮都打印验证集识别率识别率开始下降就说明该停了不用把 epoch 拉满。现象原因解决识别率一直在 10% 左右只加载了 pickle 权重的 wih没加载 who检查两个 pickle 文件是否都正确加载训练时 loss 震荡不收敛学习率设置过大0.5 以上调低学习率到 0.01~0.1 再试图片识别结果总偏向某个数字训练集样本类别不均衡检查每个数字的样本数量做数据增强或重采样4.5 训练集和测试集混用导致指标虚高现象测试集识别率高达 99%换真实手写图片识别率惨不忍睹。原因代码中数据切分逻辑混乱测试集拿了训练集的数据来评估。解决确认训练和测试使用不同的数据子集MNIST 数据集的原始划分就是 60000 训练样本和 10000 测试样本切分时不要打乱全局数据后重分而是直接使用官方划分。5. 进阶验证把识别率做到 97% 以上的调参思路把基础实现跑通之后下一步就是系统的调参和验证。我习惯先把隐藏层节点数做一组对比实验从 50、100、150、200 四个值里选最优同时固定学习率为 0.1、epoch 为 5。跑完对比后用最优隐藏层节点数再做学习率对比实验。这种单因素轮换实验要记录成表格每改一个参数就记录对应识别率避免凭感觉调参。下表是一组典型结果参考隐藏层节点数学习率训练轮数测试集识别率500.1594.2%1000.1596.1%1500.1596.3%2000.1594.8%另一个提升思路是把训练数据做归一化之外的处理比如加入旋转、平移、噪声扰动扩充训练集。BP 网络对这类数据增强很敏感样本丰富后识别率会稳定提升。也可以试试让隐藏层节点在训练时随机失活一部分这能有效抑制过拟合但需要修改neuralNetwork.py里的前向传播逻辑加入伯努利掩码。最后分享一个我自己习惯的验证技巧训练完模型后找几张手写的数字图片自己画或者用画图工具写几个数字保存为 28×28 的灰度图预处理后喂给query方法观察输出向量。如果预测结果能对五张里准确识别四张说明模型泛化能力正常如果全错大概率是预处理通道出错了比如图像没有正确灰度化或者尺寸不对。从那以后我每次训练完都会强制跑一遍手绘数字验证再做测试集评估这个习惯帮我规避了好几次「测试集准确率高但实际不可用」的坑。这套资源最大的价值就是权重已经帮你训练好存好了加载就能出结果你可以把全部精力放在理解和调参上希望这些拆解能让你少走几步弯路。本文还有配套的精品资源点击获取

相关新闻

轻量CNN+PyQt5实现离线垃圾分类GUI系统

轻量CNN+PyQt5实现离线垃圾分类GUI系统

简介:本资源是一个基于卷积神经网络(CNN)实现的垃圾分类GUI应用系统,面向深度学习初学者、计算机视觉实践者及课程设计/毕业设计学生,解决真实场景下垃圾图像识别与分类落地问题。压缩包共2000个文件,主体为…

2026/10/12 11:06:52 阅读更多 →
MDPI Sensors 论文模板使用指南:样式配置与格式自检

MDPI Sensors 论文模板使用指南:样式配置与格式自检

简介:本资源为MDPI旗下Sensors期刊的官方Word论文模板,面向准备向该刊投稿的研究生、科研人员及高校教师,帮助解决论文结构不规范、格式反复修改的问题。压缩包内仅含1个docx文件,大小约78KB,即完整的Sensors模板文档&…

2026/10/12 11:06:45 阅读更多 →
Python天气预测系统:从爬虫采集到回归建模的完整实战

Python天气预测系统:从爬虫采集到回归建模的完整实战

简介:这是一套基于Python实现的天气预测分析系统源码,面向具备一定Python基础的数据分析学习者、爬虫爱好者以及需要处理时间序列预测的开发者。资源整合了从天气数据采集、预处理、统计分析到模型预测与可视化展示的完整流程,覆盖网络爬虫、…

2026/10/12 11:06:35 阅读更多 →

最新新闻

机器学习最小可行知识链:从公式到可调试代码的完整实践

机器学习最小可行知识链:从公式到可调试代码的完整实践

简介:本资源是邹博主讲的《机器学习全方位解析:从基础到实践》配套教学包,面向零基础入门者与希望系统夯实理论与工程能力的学习者,解决机器学习概念抽象、代码实践脱节、算法调优无从下手等核心痛点。压缩包共613个文件&#xff…

2026/10/12 13:00:09 阅读更多 →
Harbor v2.13.1 ARM64离线部署实战:内网镜像仓库搭建与避坑指南

Harbor v2.13.1 ARM64离线部署实战:内网镜像仓库搭建与避坑指南

简介:本资源为 Harbor 最新 v2.13.1 的 ARM64 架构离线安装包,面向在 ARM64 服务器或 Kubernetes 集群上部署私有镜像仓库的运维与开发人员,解决国产化平台、信创环境及边缘节点无法直接拉取官方 x86 安装包的问题。压缩包共 6 个文件&#x…

2026/10/12 13:00:09 阅读更多 →
物联网平台二次开发选型指南:架构边界、扩展点与实战避坑

物联网平台二次开发选型指南:架构边界、扩展点与实战避坑

1. 为什么“适合二开”才是物联网平台选型的硬指标做物联网平台选型这件事,我踩过不少坑。早年做某智慧园区项目,技术评审时大家盯着功能清单看——设备接入、规则引擎、数据大屏、告警中心,列表很丰满,厂商演示也很流畅。结果签完…

2026/10/12 13:00:09 阅读更多 →
批处理驱动Matlab实现参数自动扫描:原理、传参与排错指南

批处理驱动Matlab实现参数自动扫描:原理、传参与排错指南

说实话,用批处理去反复跑Matlab这事儿,我最早是在一次大规模参数寻优中被逼出来的。那时候手里有一堆实验数据要拟合,模型参数有四五种组合方式,每组参数跑一遍得几十秒,加起来几百个组合,手动改一个跑一个…

2026/10/12 13:00:08 阅读更多 →
PyTorch新手必学:ResNet18从原理到手写实现详解

PyTorch新手必学:ResNet18从原理到手写实现详解

1. 项目概述:为什么ResNet18是PyTorch新手绕不开的“第一座桥”如果你刚打开Jupyter Notebook,敲下import torch,接着想跑一个真正能分类图像的模型——不是MNIST手写数字那种玩具级任务,而是能在CIFAR-10上稳定达到92%准确率、结…

2026/10/12 13:00:08 阅读更多 →
LCA最近公共祖先算法详解:倍增法、Tarjan与树链剖分

LCA最近公共祖先算法详解:倍增法、Tarjan与树链剖分

1. 从一道面试题说起:为什么LCA值得花时间搞透第一次接触LCA是在刷题的时候,题目很直白:给一棵树,多次询问两个节点的最近公共祖先。当时我的第一反应是暴力——两个节点分别往上走,标记走过的路径,第一个相…

2026/10/12 12:59: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/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练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/11 14:36:54 阅读更多 →