多层感知机从原理到实战:前向传播、反向传播与调参指南
1. 多层感知机到底在解决什么问题1.1 从单个神经元说起我接触机器学习的第一课基本都是从线性模型开始。线性回归预测房价逻辑回归做分类它们背后的数学表达其实就一行y f(wx b)。这个结构放到神经网络语境里就是一个“神经元”对输入x做加权求和加上偏置b再套一个非线性函数f。单个神经元能做什么能做线性分类。比如判断一封邮件是不是垃圾邮件只要特征设计得足够好一条直线或者高维空间里的一个超平面就能把两类数据分开。可现实世界里的数据绝大多数不是这种“一刀就能切干净”的结构。我早期用逻辑回归做某个分类任务时效果一直卡在80%出头无论怎么加特征工程都上不去。问题的根源不在数据而在于模型本身就是一条直线它表达不了复杂边界。1.2 XOR问题单层模型的无力时刻XOR异或问题是个经典反例。输入状态(0,0)、(1,1)输出0而(0,1)、(1,0)输出1。把这四个点画在二维平面里你会立刻发现无论如何都画不出一条直线能同时把两类点分开。这个结论在早期曾让神经网络的研究陷入低谷因为有人从数学上严格证明了单层感知机对这类线性不可分问题无能为力。但后来的突破思路从今天回看非常直观如果模型只用一条直线不行那就先把原始坐标做一次“空间变换”。通过某种非线性操作把原空间里的四个点映射到另一个新空间让它们在新的坐标下变得线性可分。多层感知机做的正是这件事前面的隐藏层不断对输入做特征提取和重组合最后一层再做一个线性分类决策。这就是MLP最核心的思想用若干层非线性变换把原始输入映射到一个更容易被线性模型处理的特征空间。理解这一点比记住任何公式都重要。很多讲神经网络的书一上来就堆叠激活函数和梯度公式反而把这个最朴素的目的给淹没了。1.3 为什么“深”比“宽”更受关注既然理论上单层足够宽的网络也能逼近任意函数为什么实际都要用多层、用深度结构答案有两个。第一是效率多层结构能把简单特征一步步组合成复杂特征相同参数量下表达能力更强。第二是泛化隐藏层过宽模型更容易把训练样本记下来而不是抽取共性规律表现出来就是过拟合。我习惯把MLP理解成一个“分层特征组合器”。第一层可能只学到一些很边缘的特征比如图像的像素块、文本的局部片段第二层把这些片段组合成稍微抽象的结构层数越深组合的抽象程度越高。这个视角在理解卷积神经网络时同样适用可以说MLP是所有深度模型的地基。2. 多层感知机的数学原理前向传播与反向传播2.1 全连接层的前向计算MLP由若干全连接层堆叠而成。所谓全连接就是这一层的每一个神经元都和上一层的所有输出相连。数学上一个全连接层的计算可以写成h^{l1} f(W^{(l)} h^{(l)} b^{(l)})其中h是特征向量W是权重矩阵b是偏置向量f是激活函数。这个公式中我最重视的是维度流动。假设上一层输出的维度是4当前隐藏层有128个神经元那么W的形状是[128, 4]b的形状是[128]。矩阵乘完后得到[128]的向量再逐元素套激活函数就得到当前层的输出。我踩过的第一个坑就是把W的维度写反。只要记住一句话权重矩阵的行数等于本层神经元数列数等于上一层神经元数前向传播就基本不会出维度错误。以输入维度4、隐藏层128为例这一层的参数量是4×128 128 640个。网络每深一层参数数量都会随层宽快速膨胀这也是现代模型动辄上亿参数的原因。在开始写代码之前算清每一层维度和参数量是避免大量调试时间的好习惯。2.2 激活函数的选择逻辑如果整个网络全是线性变换那么无论堆多少层最终叠加的结果仍然是一个线性变换深度就彻底失去意义了。激活函数的使命就是给网络引入非线性。实际中我反复使用的就几种激活函数公式输出范围典型场景Sigmoid1/(1e^{-z})(0,1)二分类输出层、门控结构Tanh(e^z-e^{-z})/(e^ze^{-z})(-1,1)隐藏层早期常用ReLUmax(0,z)[0,∞)隐藏层默认选择Softmaxe^{z_i} / Σ e^{z_j}(0,1)且总和为1多分类输出层Sigmoid有个非常典型的问题饱和。当z的绝对值很大时函数曲线变得非常平缓导数趋近于0。反向传播时的梯度是一层层乘下去的一旦梯度接近0浅层参数几乎收不到有效更新这就叫梯度消失。我个人的建议很明确隐藏层默认选ReLU除非你有特别明确的理由否则不要一上来就用Sigmoid。ReLU在正区间的导数恒为1能有效缓解梯度衰减计算也快缺点在后面单独聊。2.3 损失函数与输出层的搭配MLP最后输出层加什么激活函数取决于任务类型二分类输出层1个神经元用Sigmoid配合二元交叉熵损失多分类输出层K个神经元用Softmax配合交叉熵损失回归输出层不加激活函数配合均方误差损失为什么分类任务不用均方误差因为分类的期望输出是概率分布交叉熵能更好衡量两个分布之间的差异。更关键的是Softmax配上交叉熵之后梯度推导出来有一个极其简洁的结果输出层的梯度正好等于预测概率减去真实标签也就是p - y。这个形式意味着预测和真实差距越大梯度越猛更新越快差距接近0时梯度也接近0模型自然收敛不会出现梯度饱和的问题。2.4 反向传播到底在算什么东西反向传播本质上就是反复使用链式法则求损失函数对每一层权重的偏导数。我一开始不理解它的工程实现总觉得很高深拆开看其实就两个阶段前向阶段按顺序算出每一层的中间结果并缓存反向阶段从最终的损失出发沿计算图倒着走逐步求出每一层参数的梯度。用一个最小例子感受一下。假设某个神经元的输出是z w·x b激活后为a sigmoid(z)损失用二元交叉熵L -(y log a (1-y) log(1-a))。根据链式法则∂L/∂w (∂L/∂a) · (∂a/∂z) · (∂z/∂w)对于Sigmoid和交叉熵这个组合有一种很出名的简化结果∂L/∂z a - y。于是∂L/∂w (a - y)·x。也就是说误差越大梯度越大权重更新越快当预测已经准确时梯度趋近于0权重几乎没有变化。反向传播的实现逻辑听起来不复杂但真正手写一遍时会遇到很多细节问题比如中间变量缓存、矩阵乘法的方向、广播机制。这也是为什么我强烈建议初学者手写一次反向传播只有亲手推导并实现一遍你对“梯度是如何流回每一层”这件事才会有质感。3. 手写一个MLP从零开始感受每个细节3.1 构造一个线性不可分的二分类数据集为了观察MLP的真实能力我先生成一个经典的“双半月形”数据集两类样本交错分布任何一条直线都无法把它们分开。样本量300每类150个输入是二维坐标。这种数据用逻辑回归会很难看但MLP配合非线性激活后可以轻松画出灵活边界。数据生成后有一个看起来无关紧要但必然要做的步骤标准化。每个特征减掉均值、除以标准差。为什么必须做因为反向传播的梯度表达式里包含了输入特征的数值范围。假设一个特征是0到100另一个是0到1大数值特征会主导梯度更新让训练过程左右摇摆甚至不收敛。标准化之后每个特征均值为0、方差为1网络在训练初期对每个方向能一视同仁地学习。3.2 前向传播和反向传播的代码实现我按照这样一个结构来设计网络特征维度低、网络也不大方便边跑边打印中间量网络结构 - 输入层2个特征 - 隐藏层116个神经元ReLU激活 - 隐藏层28个神经元ReLU激活 - 输出层1个神经元Sigmoid激活权重初始化不是随便设的。我使用He初始化也就是让权重从均值为0、标准差为sqrt(2 / 上一层维度)的高斯分布中采样。这个预设标准差的逻辑在于ReLU在负区间会把输出压成0信号的能量天然会减少一半所以需要稍微大一点的标准差来补偿。如果初始化标准差太小深层的激活值会一批批衰减梯度也会跟着消失。下面是核心代码我会把前向和反向写在同一个类里方便对照import numpy as np class SimpleMLP: def __init__(self, in_dim, hidden1, hidden2, out_dim): # He初始化适配ReLU self.W1 np.random.randn(hidden1, in_dim) * np.sqrt(2.0 / in_dim) self.b1 np.zeros((hidden1, 1)) self.W2 np.random.randn(hidden2, hidden1) * np.sqrt(2.0 / hidden1) self.b2 np.zeros((hidden2, 1)) self.W3 np.random.randn(out_dim, hidden2) * np.sqrt(2.0 / hidden2) self.b3 np.zeros((out_dim, 1)) def forward(self, X): # X形状: (特征数, 样本数) self.z1 self.W1 X self.b1 self.a1 np.maximum(0, self.z1) # ReLU self.z2 self.W2 self.a1 self.b2 self.a2 np.maximum(0, self.z2) # ReLU self.z3 self.W3 self.a2 self.b3 self.a3 1 / (1 np.exp(-self.z3)) # Sigmoid return self.a3 def backward(self, X, y, pred): m X.shape[1] # 输出层梯度: a - y (Sigmoid 交叉熵的简化结果) dz3 pred - y dW3 (1 / m) * (dz3 self.a2.T) db3 (1 / m) * np.sum(dz3, axis1, keepdimsTrue) # 第二隐藏层 da2 self.W3.T dz3 dz2 da2 * (self.z2 0) # ReLU导数掩码 dW2 (1 / m) * (dz2 self.a1.T) db2 (1 / m) * np.sum(dz2, axis1, keepdimsTrue) # 第一隐藏层 da1 self.W2.T dz2 dz1 da1 * (self.z1 0) dW1 (1 / m) * (dz1 X.T) db1 (1 / m) * np.sum(dz1, axis1, keepdimsTrue) # 返回梯度字典 return {W1: dW1, b1: db1, W2: dW2, b2: db2, W3: dW3, b3: db3}这段代码里最容易写错的地方是ReLU的反向。ReLU在输入大于0时导数为1否则为0。所以我用(self.z2 0)生成一个布尔掩码把z2里非正的部分梯度直接清零。这样做能保证梯度的传递方向和前向计算严格一致可以少踩很多内部不一致的坑。3.3 训练循环与超参数设置训练采用小批量梯度下降每批次32个样本学习率0.05迭代轮数2000。建议初次运行时一边训练一边打印loss观察数值变化mlp SimpleMLP(in_dim2, hidden116, hidden28, out_dim1) learning_rate 0.05 epochs 2000 batch_size 32 for epoch in range(epochs): # 这里做批次划分每次取batch_size个样本 idx np.random.choice(X.shape[1], batch_size, replaceFalse) X_batch X[:, idx] y_batch y[:, idx] # 前向 pred mlp.forward(X_batch) # 二元交叉熵损失 loss -np.mean(y_batch * np.log(pred 1e-8) (1 - y_batch) * np.log(1 - pred 1e-8)) # 反向 grads mlp.backward(X_batch, y_batch, pred) # 参数更新 for param_name, grad in grads.items(): obj getattr(mlp, param_name) obj - learning_rate * grad if epoch % 200 0: print(fepoch {epoch}, loss {loss:.4f})一次典型训练中loss会从0.69附近快速下降前200轮降到0.24800轮左右降到0.121500轮后稳定在0.08附近。曲线先陡后缓是正常现象。如果loss基本不降我会优先怀疑学习率学习率太大loss会在某个区间震荡甚至发散太小则下降得像蜗牛爬需要成倍增加轮数才能看到效果。实际操作时我会把学习率先设在0.01到0.1之间做小批量实验确认能下降后再进行微调。3.4 参数数量与模型行为检查这个网络的参数不难算第一层2×161648个第二层16×88136个第三层8×119个总共193个参数。别看参数量小它已经能拟合非常复杂的非线性边界。训练后把高概率区域画出来会发现决策边界是一条平滑曲线完全不像线性模型那样只能画直线。我还有一个习惯训练结束后把隐藏层激活值的分布打印一下。如果大部分层的激活值集中在0附近说明网络已经被“压扁”大概率是初始化或学习率有问题。如果激活值的分布相对分散且数值范围不是极端说明前向信号流动正常。4. 用主流框架搭建MLP手写实现的经验迁移4.1 框架到底替你做了什么手写一遍之后再用现代深度学习框架你会感到异常轻松。框架核心解决的事情只有一个自动微分。你只需要声明网络结构、定义损失函数和优化器反向传播那一大串链式法则推导框架会在计算图上自动完成。但有件事我在带新人时反复强调不用手写反向不代表不需要懂。框架只是一个工具它不会替你判断损失和输出层是否匹配、不会替你发现数据没标准化、也不会告诉你学习率为什么爆炸。说实话很多调参问题只要你想清楚梯度是怎么流动的答案会自己浮现出来。4.2 框架版本与手写版本的核心差异用框架实现一个MLP典型的步骤可以归纳成四件事定义模型结构顺序容器依次添加全连接层、激活层、全连接层、激活层、输出层定义损失函数和优化器分类任务选交叉熵优化器可选带动量的SGD或自适应方法写训练循环读取批次数据前向计算计算损失清零梯度反向传播更新参数每轮结束后在验证集上评估监测是否过拟合于手写实现相比框架版本少了十几行反向代码但需要注意的坑并没有变少。我特别提醒一点很多框架内置的交叉熵损失会自动在内部做Softmax操作。如果你额外在网络输出层又加一个Softmax梯度就会出错模型表现也会变得很奇怪。这类错误只有真正理解前向和反向的配合才能一眼看穿。4.3 训练监控的实操技巧训练MLP时我至少会监控两个指标训练集loss和验证集loss。训练loss持续下降说明模型在学到东西如果验证loss在某个轮次之后开始回升而训练loss还在继续下降这基本上就是过拟合的信号。此时需要早停、加正则化或者增加数据量。另一个很少人提到但非常有用的监控项是梯度范数。每隔一段时间统计一下每一层参数梯度的平均绝对值。如果靠近输入层的梯度明显比靠近输出层的梯度小好几个数量级就是梯度消失的典型信号该考虑换激活函数或初始化方式了。如果梯度数值出现NaN大概率是学习率太大或数据里混进了异常值。5. 训练多层感知机最容易踩的坑与排查方法5.1 梯度消失和死亡ReLU我实际训练中遇到的第一个大坑就是梯度消失。当时我把所有隐藏层的激活函数都用成Sigmoid网络层数只有四五层但训练就是一直不收敛。我查看各层梯度范数后发现问题很明显输出层附近梯度还在0.1量级传到第三层就已经掉到1e-4以下。这样的梯度根本无法驱动浅层参数有效更新。解法其实已经很成熟隐藏层换成ReLU配合He初始化。这样能有效缓解梯度衰减。但ReLU也有自己的隐患当学习率过大或初始化不当时某个神经元对几乎所有训练样本的输入都是负数激活值恒为0反向梯度永远为0神经元就彻底死了。我之前训练一个规模稍大的模型时出现过一种现象训练过程很平稳但准确率始终上不去。把某一层激活值打出来一看70%以上的神经元输出恒定为0。这就是大范围“死亡ReLU”。我用降低学习率、换用Leaky ReLU解决了问题。Leaky ReLU在负区间保留一个很小的斜率比如0.01让神经元即使处于负区间也还有梯度可以更新。5.2 过拟合的判断与对策MLP参数多在小数据集上特别容易过拟合。我的判断方法很朴素训练集准确率一路走高验证集却开始下降两者差距越来越大就是过拟合。这时最有效的处理手段按优先级排序是增加数据量、加Dropout、加L2正则化、减小网络宽度。Dropout的原理是训练时随机让一部分神经元失活迫使网络不能过度依赖某几个神经元的组合从而学到更冗余、更通用的特征。这里有一个新手高频错误验证和测试阶段忘记关闭Dropout。如果推理时还开着Dropout输出会带随机性预测结果不稳定。手写代码时我会明确用标志位区分训练和推理阶段。5.3 超参数不合理的表现与方向调整我把实际碰到的典型症状整理成了一张速查表每次模型出了问题先按这张表对号入座而不是漫无目的地乱调参数症状最可能原因快速调整方向loss为NaN学习率过大、数据有极端值降低学习率数据标准化或裁剪loss完全不动学习率过小、数据未标准化放大学习率务必标准化训练loss低、验证loss高过拟合加Dropout、正则化、增加数据训练准确率始终在50%附近梯度消失、网络未收敛换激活函数、检查初始化深层梯度爆炸初始化不当、学习率过大用小标准差初始化学习率衰减我在调参时还有一个坚持了很久的习惯一次只改一个变量。很多同学习惯同时调学习率、网络深度、批次大小结果失控了完全不知道是哪一步引起的。正确的做法是固定其它所有因素只改变一个超参数并记录结果这样很快就能收敛到一组合理配置。5.4 我自己的调参顺序和心得我的标准流程是先把数据标准化然后用默认的ReLU激活和He初始化接着用一个小批次实验确认loss能下降最后再微调学习率和批次大小。千万不要一开始就纠结网络宽度和层数那样会在多个变量之间陷入迷茫。还有一个容易被忽略的点数据顺序。每次训练迭代时都做一次随机洗牌能避免模型学到样本顺序带来的假模式。我见过训练loss周期性波动的情况原因就是批次里样本分布不随机模型总在对某个子集的模式做响应。最后的实操体会我在实际搭建和训练模型的过程中最大的感触是理解多层感知机最好的方式就是亲手用基础库实现一遍前向和反向。这个过程可能只需要一个晚上但它带来的收益远超看十篇教程。MLP的本质说到底就是一个可微分的函数复合器输入经过一层层非线性变换最终输出一个可以被监督信号约束的结果。框架可以帮你省掉重复代码但没法帮你思考网络为什么会收敛、为什么不收敛、边界为什么长成那样。最后再分享一个小习惯我每次搭模型之前都会先在纸上把每一层的输入输出维度推一遍顺手画出计算图的粗糙草稿然后再写代码。这个方法看起来有点笨但它帮我省下了大量因为形状不匹配而反复调试的时间。等你在纸上推过三五个不同的网络结构后再回头看框架里的模型定义你会发现自己已经能直接“透视”每一层在做什么了。

相关新闻

mmdetection目标检测:从测试到可视化的完整实战指南

mmdetection目标检测:从测试到可视化的完整实战指南

做目标检测的应该都经历过这个瞬间:训练日志里的mAP明明爬到0.85,评估也没报错,可当你把测试集里随便一张图拎出来,却看到模型把背景框了个大框,或者把两个挨在一起的同类目标并成了一个。指标这个东西是统计值&#x…

2026/10/17 12:35:56 阅读更多 →
金融IT系统开发:从需求模糊到技术落地的关键路径

金融IT系统开发:从需求模糊到技术落地的关键路径

我无法根据当前输入生成符合要求的博文。原因如下:项目标题 "financial-services" 过于宽泛,仅为一个行业领域名词,未指向具体技术实现、业务场景、问题解决或实操项目(如“基于微服务架构的支付对账系统设计”“银行风…

2026/10/17 12:35:56 阅读更多 →
等保测评方案落地全流程:从定级备案到复测评实操拆解

等保测评方案落地全流程:从定级备案到复测评实操拆解

简介:本资源为等保测评服务方案文档,面向信息安全从业者、系统运维人员及需要开展等级保护工作的企业技术负责人,帮助解决信息系统定级、备案与测评流程缺乏规范参考的问题。压缩包内共1个doc文件,约1.07MB,内容围绕等…

2026/10/17 12:34:56 阅读更多 →

最新新闻

强化学习策略优化:从单调提升理论到TRPO/PPO工程实践

强化学习策略优化:从单调提升理论到TRPO/PPO工程实践

强化学习学到这个阶段,大部分公式推导和代码实现都能跑通了,但有一类问题始终绕不过去:理论上讲,策略优化的目标应该让性能越改越好,实际训练里却经常出现"越改越差"。这个问题的系统解答,就是 M…

2026/10/17 13:30:35 阅读更多 →
BiliTools B站下载工具完整教程:视频、番剧、弹幕、无损音乐一次存进本地

BiliTools B站下载工具完整教程:视频、番剧、弹幕、无损音乐一次存进本地

BiliTools B站下载工具完整教程:视频、番剧、弹幕、无损音乐一次存进本地 【免费下载链接】BiliTools 本项目已停止维护。 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools 你想把一部番剧留在自己硬盘里,客户端却只给"缓存…

2026/10/17 13:30:35 阅读更多 →
Vue3+TypeScript实现MD5加密解密工具:算法原理与工程实践

Vue3+TypeScript实现MD5加密解密工具:算法原理与工程实践

做开发这些年,MD5 大概是碰得最频繁的“加密”工具之一。测接口签名、校验文件完整性、给测试数据造个定长指纹,随手就是一个 md5()。但真正要把这东西做成一个能上线的工具,尤其是用 Vue 3 和 TypeScript 从零写一个带“加密/解密”能力的在…

2026/10/17 13:30:35 阅读更多 →
DouK-Downloader 完整指南:5 分钟跑通抖音 / TikTok 视频下载与归档

DouK-Downloader 完整指南:5 分钟跑通抖音 / TikTok 视频下载与归档

DouK-Downloader 完整指南:5 分钟跑通抖音 / TikTok 视频下载与归档 【免费下载链接】TikTokDownloader 抖音 / TikTok 平台作品下载/数据采集工具 项目地址: https://gitcode.com/GitHub_Trending/ti/TikTokDownloader 想把这个账号的所有作品一次归档&…

2026/10/17 13:30:35 阅读更多 →
数字员工工作流实战:从IT工单到财务报销的可交付落地指南

数字员工工作流实战:从IT工单到财务报销的可交付落地指南

1. 这不是又一个“AI Agent教程”,而是一套可跑通、能交付、真落地的数字员工工作流 最近在几个技术社区和企业内训现场,反复被问到一个问题:“Hermes Agent到底能不能用?不是概念演示,是真能替人干活的那种。”我试过…

2026/10/17 13:30:35 阅读更多 →
2025人工智能指数报告解读:从趋势数据到工程决策

2025人工智能指数报告解读:从趋势数据到工程决策

简介:这份2025年人工智能指数报告由斯坦福大学人类中心人工智能研究所发布,是第八版AI指数报告,旨在为政策制定者、研究人员、企业高管、记者及公众提供关于全球AI发展态势的权威数据参考。压缩包内为1个PDF文件,大小29.46MB&…

2026/10/17 13:29:34 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →