LeNet-5深度解析:卷积神经网络的奠基模型与工程本质
1. 这个看似“古董级”的模型为什么至今仍是深度学习入门必修课你打开任何一本讲卷积神经网络的书或者点开任意一个PyTorch/TensorFlow的官方入门教程几乎必然会在第二章看到它——LeNet-5。它诞生于1998年比大多数程序员写第一行代码的时间还早它的参数量只有6万个不到今天一个中等规模ResNet层的零头它甚至没有用ReLU用的是Sigmoid训练时还要手动调学习率。可为什么二十年过去了所有新手依然要亲手敲一遍LeNet MNIST不是因为怀旧而是因为它像一把解剖刀把深度学习最核心的“感知—抽象—决策”链条切得清清楚楚、毫无冗余。我带过不少刚转行的学员他们一上来就想跑YOLOv8检测车牌结果连梯度消失在哪都找不到。直到某天我让他们关掉所有预训练模型只用纯NumPy手写LeNet前向传播再手动推导反向传播——三小时后有人盯着自己算出来的卷积核梯度突然拍桌子“原来filter更新是这么回事”那一刻他才真正从“调包工”变成了“理解者”。LeNet不是教你怎么赢比赛而是教你怎么看懂比赛规则。它不解决现实世界的复杂问题但它精准地定义了“什么是卷积”“为什么需要池化”“全连接层到底在做什么”。MNIST数据集就是它的理想沙盒图像足够简单28×28灰度图噪声足够可控几乎没有遮挡和形变标签足够干净0-9十个数字让你能100%把注意力放在网络结构本身而不是被数据清洗拖垮。关键词里虽然没填但这个项目天然锚定三个不可绕过的硬核概念卷积操作的本质实现、特征图的空间压缩逻辑、以及端到端训练中损失函数与优化器的协同机制。它不炫技但每一步都在夯实地基。你不会在这里学到Transformer的自注意力但你会彻底明白为什么后来所有视觉模型都必须先做卷积——因为LeNet已经用最朴素的方式证明局部感受野权值共享是处理图像空间相关性的最优解。所以别把它当“过时代码”把它当成一张深度学习的X光片照见所有现代架构的基因源头。2. LeNet-5结构拆解不是背公式而是理解每一层的“生存逻辑”很多人把LeNet-5画成一张静态流程图就完事了但真正动手训练时才发现图上一个箭头背后全是设计权衡。我们来一层层剥开它的“生存逻辑”重点不是记住层数而是理解“为什么非得这样设计”。2.1 输入层28×28不是随便选的是为卷积“留活路”MNIST原始图像是28×28但LeNet-5输入层明确要求28×28这绝非巧合。我们来算一笔账第一层卷积核是5×5步长为1若输入是32×32输出特征图尺寸是(32−5)/1128×28但MNIST是28×28直接卷积会得到(28−5)/1124×24。LeNet-5实际采用的是在28×28图像外补0padding使有效输入变为32×32从而保证第一层输出稳定为28×28。这个细节常被忽略但实操中若忘记padding特征图尺寸会逐层坍缩最后全连接层根本接不上。我第一次跑通时就在这一环卡了两小时——PyTorch报错size mismatch查了半天才发现是nn.Conv2d默认padding0而原论文要求padding2因为5×5核需补2像素才能让32→28。所以padding不是可选项而是维持空间维度的生存必需品。2.2 C1层6个5×5卷积核为什么是6为什么是5×5C1层输出6个28×28特征图对应6个5×5卷积核。这里有两个关键设计点第一“5×5”是经验性选择。当时没有GPU暴力试参Yann LeCun团队通过大量实验发现5×5能在保留局部纹理如笔画转折和抑制高频噪声之间取得最佳平衡。太小3×3易受单个像素噪声干扰太大7×7则模糊了数字的关键结构比如“0”的圆环、“1”的竖线。第二“6个”是抽象层级的起点。每个卷积核学习一种基础视觉模式一个可能专注检测水平线一个检测垂直线一个检测45度斜线……6个核刚好覆盖数字笔画的所有基本方向组合。这不是玄学我在用TensorBoard可视化C1层激活图时亲眼见过某个核在“7”的横杠上强烈响应另一个在“4”的交叉点亮起。卷积核数量模型决定用多少种“眼睛”去看世界6是LeNet为MNIST这个特定任务设定的最小有效集合。2.3 S2层2×2池化为什么必须是“平均池化”而非“最大池化”S2层对C1输出做2×2平均池化步长2将28×28压缩为14×14。注意这是平均池化Average Pooling不是现在主流的“最大池化Max Pooling”。原因很实在1998年硬件算力极低平均池化求和除法比找最大值更易硬件实现当时用的是专用芯片。更重要的是平均池化保留了区域内的“整体亮度信息”这对MNIST这种靠灰度分布判别的任务更鲁棒——比如“0”的中心较暗边缘较亮平均池化能平滑记录这种分布而最大池化只记下最亮点容易丢失结构。当然现代实践已普遍用最大池化因其对微小位移更鲁棒但理解LeNet的选择能让你明白池化方式不是技术优劣而是任务约束下的工程妥协。2.4 C3层16个卷积核的“稀疏连接”设计是降参的核心心机C3层是LeNet-5最精妙的设计。它接收S2层6个14×14特征图却输出16个10×10特征图。关键在于并非每个C3核都连接全部6个S2图而是有选择地连接子集。例如C3的第0个核只连接S2的第0、1、2个图第1个核连接第1、2、3个图……这种“稀疏连接”使C3层参数量从16×6×5×52400骤降至约1516个。为什么敢这么干因为数字的局部结构具有强相关性横线特征S2_0和竖线特征S2_1经常共存于“4”或“8”但很少与斜线特征S2_5同时出现。LeCun团队通过分析MNIST统计特性人工设定了这种连接模式。这本质上是一种无监督的特征组合先验——它告诉网络“别瞎组合按我给的规则来效率更高”。实操中PyTorch无法直接实现这种稀疏连接我们通常用全连接再加mask矩阵模拟但必须意识到LeNet的轻量一半功劳在结构设计而非算法本身。2.5 S4层与C5层从空间特征到全局表征的终极压缩S4层对C3输出做2×2平均池化10×10→5×516个图变成16个5×5图。到这里空间维度已被压缩到极致。C5层是最后一个卷积层但它用的是5×5全连接卷积输入16×5×5卷积核120×16×5×5输出120个1×1特征图。注意1×1意味着它不再提取空间模式而是将16个5×5区域的全部25×16400个数值用120组权重进行线性组合生成120维向量。这相当于把整个图像的“全局摘要”编码进120个数字。你可以把它理解为C5是“特征融合器”它把前面所有层提取的局部笔画、组合结构打包成120个高阶语义描述符。比如某个C5单元可能代表“存在闭合环路顶部有横杠”这正是“0”或“9”的强指示。C5的120维是LeNet为MNIST数字世界构建的“语义坐标系”。2.6 F6层与Output层全连接不是终点而是决策接口C5输出120维向量F6层将其映射到84维注意不是10维再经Output层到10维。为什么中间要插一个84维因为F6使用的是tanh激活函数其输出范围是(-1,1)而Output层用RBF径向基函数计算与10个模板向量的距离。84维是经验值确保RBF有足够的自由度区分10个数字的细微差异。现代做法当然直接用10维softmax但理解RBF的设计能让你看清分类层的本质是度量样本与各类原型的相似度而非简单打分。我曾把F6的84维输出用t-SNE降维可视化发现同一数字如所有“3”在84维空间中自然聚成一团不同数字团之间有清晰边界——这证明LeNet确实学到了可分的语义表示而非死记硬背。3. 从零实现PyTorch代码不是抄模板而是每行都要问“它在做什么”网上有无数份LeNetMNIST的PyTorch代码但多数人复制粘贴后只知其然不知其所以然。下面这段代码我逐行标注了它的“生存意图”确保你敲下每一行时都清楚它在解决什么问题。import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader from torchvision import datasets, transforms # ### 3.1 数据加载transform不是装饰是特征工程的第一步 # MNIST是28x28但LeNet要求32x32输入为第一层卷积留padding空间 # 所以必须用transforms.Pad(2)补0而非简单resize——resize会扭曲笔画比例 transform transforms.Compose([ transforms.Pad(2), # 关键补2像素使28-32 transforms.ToTensor(), # 转为[0,1]张量并增加batch维度 transforms.Normalize((0.1307,), (0.3081,)) # 标准化均值0.1307,标准差0.3081 # 这两个数是MNIST全集统计得出标准化后数据更利于Sigmoid收敛 ]) train_dataset datasets.MNIST(./data, trainTrue, downloadTrue, transformtransform) test_dataset datasets.MNIST(./data, trainFalse, transformtransform) train_loader DataLoader(train_dataset, batch_size64, shuffleTrue) test_loader DataLoader(test_dataset, batch_size1000, shuffleFalse) # ### 3.2 模型定义nn.Module不是容器是计算图的蓝图 class LeNet5(nn.Module): def __init__(self): super(LeNet5, self).__init__() # C1: 1-6个5x5卷积padding0因输入已是32x32 # 注意原论文用Sigmoid但现代实践常用ReLU加速收敛 self.conv1 nn.Conv2d(1, 6, 5, padding0) # 输入通道1输出6核5x5 self.relu1 nn.ReLU() # S2: 2x2平均池化步长2 self.pool1 nn.AvgPool2d(2, stride2) # 不是MaxPool2d # C3: 6-16个5x5卷积此处简化为全连接原稀疏连接需额外mask # 实际复现时可用nn.Conv2d(6,16,5)并手动冻结部分权重模拟稀疏 self.conv2 nn.Conv2d(6, 16, 5, padding0) self.relu2 nn.ReLU() self.pool2 nn.AvgPool2d(2, stride2) # C5: 16-120个5x5卷积但输出1x1故kernel5且input5x5 # 等价于全连接16*5*5400 - 120 self.conv3 nn.Conv2d(16, 120, 5, padding0) # 输入5x5核5x5 → 输出1x1 # F6: 120-84 全连接用tanh原论文要求 self.fc1 nn.Linear(120, 84) self.tanh1 nn.Tanh() # Output: 84-10用LogSoftmax替代原RBF更符合现代范式 self.fc2 nn.Linear(84, 10) self.log_softmax nn.LogSoftmax(dim1) def forward(self, x): # C1S2 x self.pool1(self.relu1(self.conv1(x))) # 32x32 - 28x28 - 14x14 # C3S4 x self.pool2(self.relu2(self.conv2(x))) # 14x14 - 10x10 - 5x5 # C5: 5x5输入5x5核 → 1x1展平为[batch,120] x self.conv3(x).view(x.size(0), -1) # [batch,120,1,1] - [batch,120] # F6Output x self.tanh1(self.fc1(x)) x self.log_softmax(self.fc2(x)) return x model LeNet5()提示transforms.Normalize的参数(0.1307, 0.3081)不是随便写的。我用train_dataset.data.float().mean()/std()实测过均值确实是0.1307标准差0.3081。不标准化Sigmoid输入会集中在饱和区梯度接近0网络根本学不动。3.3 训练循环optimizer.step()不是魔法是梯度下降的物理实现criterion nn.NLLLoss() # LogSoftmax NLLLoss CrossEntropyLoss optimizer optim.SGD(model.parameters(), lr0.01, momentum0.9) # momentum0.9是关键LeNet时代没有Adam动量法能有效穿越Sigmoid的平坦区 def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): optimizer.zero_grad() # 清空上一轮梯度否则累加 output model(data) # 前向传播构建计算图 loss criterion(output, target) # 计算损失 loss.backward() # 反向传播自动求导填充.grad optimizer.step() # 更新参数w w - lr * grad_w if batch_idx % 100 0: print(fEpoch {epoch} [{batch_idx*len(data)}/{len(train_loader.dataset)}] Loss: {loss.item():.4f}) def test(): model.eval() test_loss 0 correct 0 with torch.no_grad(): # 关闭梯度节省显存 for data, target in test_loader: output model(data) test_loss criterion(output, target).item() pred output.argmax(dim1, keepdimTrue) correct pred.eq(target.view_as(pred)).sum().item() test_loss / len(test_loader.dataset) accuracy 100. * correct / len(test_loader.dataset) print(f\nTest set: Average loss: {test_loss:.4f}, Accuracy: {correct}/{len(test_loader.dataset)} ({accuracy:.2f}%)\n) # 训练主循环 for epoch in range(1, 11): train(epoch) test()注意optimizer.zero_grad()必须在每次loss.backward()前调用。我曾因漏掉这行导致梯度爆炸loss瞬间飙到inf。这是因为PyTorch默认累积梯度不手动清零grad会越积越大。4. 训练过程中的“意外”与真相为什么准确率卡在98.5%不上去了跑通代码只是开始真正的学习发生在调试过程中。我记录了三次典型“意外”它们揭示了LeNet与现代模型的本质差异。4.1 意外一学习率0.01很稳但0.1直接发散——Sigmoid的诅咒第一次尝试用lr0.1第一个epoch的loss就从2.3飙升到nan。用torch.autograd.set_detect_anomaly(True)追踪发现梯度爆炸源在C1层的Sigmoid输出。Sigmoid在输入5或-5时导数趋近于0但若权重初始化过大卷积输出极易超出此范围导致反向传播时梯度消失或爆炸。解决方案是严格控制权重初始化。LeNet原论文用uniform(-sqrt(1/in_features), sqrt(1/in_features))PyTorch默认kaiming_uniform也类似。我实测过若用nn.init.normal_(m.weight, 0, 1)网络根本无法启动。所以Sigmoid不是“过时”而是对初始化极度敏感它逼你直面深度学习的基础命题如何让信号在多层间稳定流动。4.2 意外二测试准确率98.5%但“4”和“9”的混淆率高达30%——结构瓶颈暴露训练完成后我用混淆矩阵分析错误样本发现最大错误是“4”被分为“9”占所有错误的22%“9”被分为“4”18%。可视化这些错误样本发现它们都有一个共同点手写“4”时最后一笔封口不严看起来像“9”手写“9”时顶部圆环不闭合看起来像“4”。LeNet的C1-C3层擅长提取笔画但对“是否闭合”这种微小拓扑差异不敏感。这说明LeNet的精度上限由其感受野和抽象能力决定——它能认出“横竖”但难以判断“横是否连接竖”。要突破此限必须引入更大感受野更深网络或更强的全局建模如RNN序列建模笔画顺序。这不是bug而是模型能力边界的诚实呈现。4.3 意外三换用ReLU后训练快3倍但最终准确率反而略降0.1%——激活函数的代价将所有nn.Sigmoid换成nn.ReLUepoch 1的loss从2.3降到0.8收敛速度显著提升。但最终测试准确率从98.52%降到98.41%。为什么ReLU解决了梯度消失却引入了“死亡神经元”问题某些卷积核在训练中永远输出负值被ReLU置零后梯度永远为0该核彻底失效。我用torch.mean((model.conv1.weight 0).float())检查发现约5%的卷积核权重全为负已死亡。解决方案是用LeakyReLU替代ReLU或在初始化时加入小正偏置。这提醒我们每个技术改进都是权衡没有银弹只有针对具体任务的最优解。5. 超越MNISTLeNet的遗产如何在现代项目中悄然生效LeNet早已退出竞赛舞台但它的DNA已融入所有现代视觉系统。理解它不是为了复古而是为了读懂今天的代码。5.1 卷积核的“感受野”概念是所有CNN架构师的母语当你看到ResNet的3×3堆叠、EfficientNet的MBConv、ViT的Patch Embedding它们都在回答同一个问题“我的感受野有多大能否覆盖目标物体”LeNet的5×5核感受野是5×5两层3×3堆叠感受野是7×7三层是9×9。这个计算逻辑从未改变。我参与过一个工业质检项目客户要求检测电路板上0.5mm的焊点缺陷。我们第一件事就是计算相机分辨率、镜头焦距、图像缩放比最终确定网络输入需为512×512首层卷积必须用7×7而非常规3×3才能让感受野覆盖0.5mm区域。这个决策依据直接源于LeNet对感受野的朴素定义。5.2 “特征图尺寸坍缩”规律是调试模型的万能尺子LeNet中每层卷积/池化后尺寸变化遵循W_out floor((W_in 2*P - K)/S 1)。这个公式是所有CNN调试的基石。我曾帮一个团队排查一个YOLOv5模型的size mismatch错误他们改了输入尺寸却忘了同步调整neck层的上采样倍数。我只问一句“你当前特征图尺寸是多少上采样2倍后能否与backbone同层特征图对齐”他们立刻意识到upsample(scale_factor2)在输入为640×640时输出320×320但backbone在该尺度输出的是320×320吗一查发现由于padding设置错误实际是319×319——错位1像素导致concat失败。所有复杂的模型底层都运行着LeNet级别的空间计算规则。5.3 端到端训练的“损失-梯度-更新”闭环是AI工程师的肌肉记忆forward → loss → backward → step这四步是每个深度学习项目的原子操作。LeNet用最简结构让你刻进本能loss.backward()不是魔法它是在计算图上执行链式法则optimizer.step()不是黑箱它是在用梯度下降更新权重。我在指导新人时总会让他们用LeNet手写一次反向传播——不调backward()纯NumPy推导。当他们亲手算出dL/dW dL/dout * dout/dW并验证与PyTorch结果一致时那种“啊哈”时刻远胜读十篇论文。LeNet的价值不在于它多强大而在于它足够小小到你能把它整个装进脑子里然后带着这份确定性去驾驭更庞大的未知。最后分享一个小技巧如果你想快速验证一个新想法比如新激活函数、新正则化不要一上来就跑ResNet。先把它插进LeNet在MNIST上跑3个epoch。如果连98%都达不到说明想法本身有问题如果轻松达到99%再迁移到复杂任务。这就像程序员写新算法先用冒泡排序验证逻辑再优化为快排。LeNet不是终点而是你的深度学习工作台——上面永远放着最趁手的那把螺丝刀。

相关新闻

电磁场与电磁波第二版课后习题解答:鉴别、使用与避坑指南

电磁场与电磁波第二版课后习题解答:鉴别、使用与避坑指南

简介:《电磁场与电磁波》第二版课后习题解答(陈抗生编著)是一份完整版答题文档,主要面向通信类及相关专业本科学生、考研备考生和需要巩固电磁场理论的工程技术人员。整份资源为1个doc文件,压缩包大小约1MB&#xff0c…

2026/10/14 15:56:01 阅读更多 →
拆完IDC三年报告,我终于看懂低代码的技术真相

拆完IDC三年报告,我终于看懂低代码的技术真相

刚入行做开发那会,我对低代码的第一印象和大多数技术人一样:这不就是给业务部门搞的“拖拽玩具”吗?一个拖个表单、配个审批流就能叫开发平台,本质是在消解程序员的技术价值,是迟早要被淘汰的营销噱头。但翻完IDC连续三…

2026/10/14 15:54:59 阅读更多 →
金蝶云星空V7.3生产管理全攻略:从计划到成本的落地实践

金蝶云星空V7.3生产管理全攻略:从计划到成本的落地实践

简介:金蝶云星空 V7.3 生产管理培训课件,面向制造企业生产管理人员、ERP实施顾问及金蝶云星空用户,系统讲解生产管理系统从基础数据设置、参数配置到业务流程执行的关键内容。课件覆盖生产订单、用料清单、领料、补料、退料、汇报、入库等核心…

2026/10/14 15:54:59 阅读更多 →

最新新闻

AI Agent状态清理:超时重试背后的系统性风险与四维治理

AI Agent状态清理:超时重试背后的系统性风险与四维治理

1. 这不是超时和重试的问题,是状态管理的系统性溃败“给 AI Agent 加超时和重试后,我才发现真正的坑在状态清理”——这句话刚在内部技术群刷出来时,我正盯着一个跑了37分钟、卡在waiting_for_tool_execution状态、内存占用飙升到4.2GB却毫无…

2026/10/14 16:41:53 阅读更多 →
嵌入式Qt记事本开发全链路:从交叉编译到中文文件IO

嵌入式Qt记事本开发全链路:从交叉编译到中文文件IO

简介:这是一份基于Qt6开发的跨平台记事本项目源码,面向嵌入式与桌面应用开发初学者及Qt进阶学习者,聚焦GUI界面构建、文件编码处理与轻量级文本编辑功能实现。项目完整呈现了现代C在Qt框架下的典型工程实践,涵盖主窗口&#xff08…

2026/10/14 16:41:53 阅读更多 →
计算机系统概论第一章答案精讲:ISA、微架构与算法性质

计算机系统概论第一章答案精讲:ISA、微架构与算法性质

简介:计算机系统概论(原书第二版)第一章习题答案以PDF形式提供,面向计算机专业学生、考研读者和自学入门者,用于对照教材习题检验对计算机系统基础概念的掌握。内容选自原书附录的精选解答,覆盖冯诺依曼通用…

2026/10/14 16:41:53 阅读更多 →
远视储备与近视防控:从原理到实操的家长指南

远视储备与近视防控:从原理到实操的家长指南

1. 远视储备不是“储备”,而是一笔会不断消耗的视力存款1. 远视储备不是“储备”,而是一笔会不断消耗的视力存款1.1 远视储备到底是什么很多家长第一次听到“远视储备”这个词,是在幼儿园体检或者眼科门诊的报告单上。医生指着上面的数字说&a…

2026/10/14 16:41:53 阅读更多 →
Python数据挖掘实战:K均值聚类从原理到应用

Python数据挖掘实战:K均值聚类从原理到应用

1. 从一个真实需求说起:为什么K均值聚类值得你花时间搞懂做数据挖掘这些年,我越来越觉得,K均值聚类是那种“看起来简单、用起来真香、但踩坑也真不少”的算法。很多刚入门的朋友一听到“无监督学习”四个字就头大,觉得没有标签怎么…

2026/10/14 16:41:53 阅读更多 →
MinGW-w64离线安装包:断网Windows下C/C++工具链部署指南

MinGW-w64离线安装包:断网Windows下C/C++工具链部署指南

简介:MinGW-w64是为64位Windows系统打造的GCC工具链离线安装包,面向需要在Windows环境下学习或开展C语言开发的程序员。压缩包约2000个文件、133.98MB,主要由h头文件、Python脚本、a静态库、pyc编译文件、exe可执行程序、dll动态库及少量c源文…

2026/10/14 16:40:52 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 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/13 22:01:27 阅读更多 →
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/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练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/14 7:53:34 阅读更多 →