PyTorch实现LeNet-5:MNIST手写数字识别入门实战
1. 为什么LeNet-5依然是动手学CNN最值得跑的入门项目如果只让我推荐一个深度学习入门实战项目我不会推那些花哨的Transformer或者大模型微调而会告诉你用PyTorch实现LeNet-5并在MNIST手写数字数据集上完成分类。这个项目我第一次跑通是在好几年前之后每次带新人入门我都会让他们先把这个项目完整走一遍。原因很简单它麻雀虽小但五脏俱全——CNN的卷积、池化、全连接、训练、评估、调参所有核心环节一个不少。先说这个项目到底解决的是什么问题。MNIST数据集是机器学习领域最经典的基准数据集之一包含0到9共10个类别的手写数字灰度图片每张图片尺寸是28x28像素。任务就是训练一个模型输入一张手写数字图片输出它对应的数字类别。LeNet-5是卷积神经网络的开山之作早在1998年就被提出用于手写数字识别当年在MNIST上已经能达到99%左右的准确率。用PyTorch把这样一个经典结构复现出来你会真正理解CNN中每个组件为什么存在、参数怎么流动、维度怎么变化——这些理解是直接调用现成模型库永远得不到的。这篇文章适合两类读者一类是刚学完PyTorch基础语法、想跑通第一个完整CNN项目的初学者另一类是已经能跑通一些现成模型但想回过头来吃透经典网络结构细节的同学。我会从网络结构逐层拆解、数据加载细节、训练循环实现、测试评估、再到调优实录完整走一遍我的实现过程所有代码都可以直接照着写。2. 网络结构逐层拆解每个参数都有来龙去脉2.1 从输入到输出28x28图片在LeNet-5中经历的变化LeNet-5的原始结构共7层但原始设计输入是32x32。MNIST图片是28x28所以实际实现时有两个选择一是将MNIST图片padding到32x32严格还原原始结构二是在PyTorch实现中直接按28x28来调整第一层卷积的padding。我建议新手选择第二种因为实现更直接代码也更简洁而核心的卷积池化结构保持不变。先说清楚一张图片在完整网络中的维度变化。我用PyTorch的写法来展示每一层的变化import torch import torch.nn as nn class LeNet5(nn.Module): def __init__(self, num_classes10): super(LeNet5, self).__init__() # C1: 卷积层6个5x5卷积核输入1通道输出6通道 self.conv1 nn.Conv2d(in_channels1, out_channels6, kernel_size5, padding2) # S2: 池化层2x2最大池化 self.pool1 nn.AvgPool2d(kernel_size2, stride2) # C3: 卷积层16个5x5卷积核 self.conv2 nn.Conv2d(in_channels6, out_channels16, kernel_size5) # S4: 池化层 self.pool2 nn.AvgPool2d(kernel_size2, stride2) # C5: 全连接层将16x5x5拉伸为400维映射到120 self.fc1 nn.Linear(16 * 5 * 5, 120) # F6: 全连接层120 - 84 self.fc2 nn.Linear(120, 84) # 输出层84 - 10 self.fc3 nn.Linear(84, num_classes) def forward(self, x): x self.pool1(torch.relu(self.conv1(x))) x self.pool2(torch.relu(self.conv2(x))) x x.view(x.size(0), -1) x torch.relu(self.fc1(x)) x torch.relu(self.fc2(x)) x self.fc3(x) return x输入是(batch_size, 1, 28, 28)经过conv1padding2保持尺寸不变还是28x28再经过2x2池化变成14x14此时有6个通道。conv2是5x5卷积无padding从14x14变到10x10通道数从6变到16。再池化一次变成5x516个通道。展平后就是16×5×5400维向量后面接三个全连接层最后输出10维向量对应10个数字类别。以上每一步你在实现时可以随时打印x.shape验证跑一遍基本就不会对维度产生迷惑。2.2 激活函数为什么现代实现把sigmoid换成了ReLU原始LeNet-5在卷积层和全连接层之间使用的激活函数是tanh或sigmoid。我在实际实现中用的是ReLU。这不是偷懒而是有明确理由ReLU计算更快、梯度在正区间恒为1能有效缓解深层网络中的梯度消失问题。从实际效果看在MNIST这个任务上用ReLU和用tanh的最终准确率差距不大可能都在99%左右但ReLU训练收敛明显更快。我自己对比过同样的超参数下ReLU大约在第3到4个epoch就能达到95%以上而tanh可能要慢上一两个epoch。而且PyTorch中torch.relu与F.relu直接可用实现成本几乎为零。需要提醒的是LeNet-5原论文中S2和S4用的是平均池化Average Pooling而很多现代教程喜欢换成最大池化Max Pooling。两种我都实际跑过。在MNIST上最大池化往往比平均池化最终准确率略高且收敛更稳定这跟图像中边缘和关键纹理的激活值分布有关。我的建议是新手先用最大池化跑通稳定性更好等对网络理解深入后可以再切换回平均池化对比效果。2.3 参数量计算这个网络到底有多少个可学习参数理解一个网络最好的方式之一是亲手算一遍参数量。很多初学者跑通代码后对网络规模完全没有概念这是不行的。按照上面实现的LeNet-5我帮你逐层计算一遍总参数量conv16个5x5卷积核输入通道1每个核有5×51bias26个参数共6×26156个参数conv216个5x5卷积核输入通道6每个核有6×5×51151个参数共16×1512416个参数fc1400×12012048120个参数fc2120×848410164个参数fc384×1010850个参数总和就是1562416481201016485061706个参数约6.2万个。这个数字值得记住因为对比现在动辄几亿、几十亿参数的模型LeNet-5的规模让你可以毫无压力地在CPU上完成训练这也是它作为入门项目不可替代的优势之一。我自己写过一个简单函数来确认参数总量model LeNet5() total_params sum(p.numel() for p in model.parameters()) print(fTotal parameters: {total_params}) # Output: Total parameters: 61706跑完这个打印你就能很直观地感受到一个精巧的结构设计可以只用6万参数解决一个10分类视觉任务这对建立对模型设计的直觉非常有价值。3. 数据加载与预处理不容忽视的0.1307和0.30813.1 归一化为什么是0.1307和0.3081MNIST数据集在PyTorch中通过torchvision.datasets.MNIST可以直接下载和使用。几乎所有官方教程中都会出现下面这段代码transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_dataset torchvision.datasets.MNIST( root./data, trainTrue, transformtransform, downloadTrue ) test_dataset torchvision.datasets.MNIST( root./data, trainFalse, transformtransform )很多初学者到这一步都是直接照抄完全不理解这两个数字是什么。这两个数字分别是MNIST数据集全体样本的灰度均值和标准差。因为图片是单通道灰度所以只有一个均值和一个标准差这就是为什么写法是(0.1307,)而不是(0.1307, 0.1307, 0.1307)。归一化的目的是让输入数据的分布接近标准正态分布均值为0、方差为1这对神经网络的训练至关重要。如果输入像素值范围在[0, 1]之间经过网络多层计算后数值容易产生偏移梯度更新也会受影响归一化后每个特征的尺度一致梯度下降的收敛路径会更平滑。这两个数字不是随便选的而是基于整个MNIST训练集统计出来的真实值。你在自己的项目中也可以直接沿用因为数据集是同一个。但如果换了其他数据集就必须重新统计均值和标准差。3.2 DataLoader的核心逻辑batch_size、shuffle与多进程数据加载还有一个关键的组件DataLoader。新手最容易忽略它的参数设计。train_loader torch.utils.data.DataLoader( train_dataset, batch_size64, shuffleTrue, num_workers2 ) test_loader torch.utils.data.DataLoader( test_dataset, batch_size256, shuffleFalse, num_workers2 )我解释一下这几个参数为什么这么设置batch_size一次喂给模型多少张图片。64是训练集的常见选择小batch能让梯度估计更频繁更新同时不至于太慢测试集用256是因为评估阶段不用更新梯度可以更充分地在同一批次内完成计算提高吞吐量。shuffle训练集必须设为True。如果不打乱每个epoch内模型看到的样本顺序完全一致可能会学到样本顺序相关的虚假模式影响泛化能力。测试集不需要打乱。num_workers数据加载使用几个子进程。设为0表示主进程直接加载设为2或4能加速大批量数据读取。但Windows上有时多进程会引发断点问题保守起见设为0或2都能跑。还有一个很常见的问题是为什么要用torchvision.datasets.MNIST自带的ToTensor而不直接读原始图片因为ToTensor会把PIL图片或numpy数组的HWC格式转为CHW的Tensor同时把像素值从[0, 255]缩放到[0.0, 1.0]。这个通道顺序转换正是PyTorch卷积层期望的输入格式少了这一步网络根本跑不起来。3.3 下载失败的常见原因与离线处理方法MNIST数据集托管在互联网上国内某些网络环境下直接downloadTrue可能会失败。我在给同事配环境时遇到过不止一次。解决方案有两种。第一种是设置镜像源。PyTorch官方提供了torchvision.datasets.MNIST的mirror参数指向某个备用下载地址。但这个方法在新版本torchvision中其实已经不太好用了因为底层下载逻辑变了。第二种是我更推荐的离线方案先手动下载好四个文件train-images-idx3-ubyte.gz、train-labels-idx1-ubyte.gz、t10k-images-idx3-ubyte.gz、t10k-labels-idx1-ubyte.gz放到./data/MNIST/raw/目录下然后在创建MNIST对象时设置downloadFalse。PyTorch会自动识别已经存在的原始文件并解压处理。这个方法在离线环境或内网机器上特别实用。4. 训练循环的完整实现从损失函数到优化器的每个细节4.1 损失函数交叉熵的前向计算与梯度传导分类任务的默认损失函数是交叉熵。在PyTorch中直接用nn.CrossEntropyLoss()即可。这里有一个非常容易混淆的点CrossEntropyLoss内部已经包含了Softmax操作所以模型的最后一层不需要额外添加Softmax激活函数。我在第一次实现时就在这里踩过坑——模型输出层后面又手动加了一层Softmax导致训练时损失一直不降后来检查发现梯度传播被Softmax的数值特性干扰了。交叉熵损失的具体计算逻辑是模型输出层得到10个原始分数logitsCrossEntropyLoss内部先做Softmax将其转换为概率分布然后用真实标签的one-hot分布去计算负对数似然。对于单个样本如果模型给正确类别的置信度是0.95那么该样本的损失就是-log(0.95)≈0.051如果置信度只有0.5损失就是-log(0.5)≈0.693。正确类别的置信度越低损失越大梯度就会推动模型把这个类别的分数推高。下面是我完整训练函数的关键代码import torch.optim as optim def train_one_epoch(model, train_loader, criterion, optimizer, device): model.train() running_loss 0.0 correct 0 total 0 for batch_idx, (images, labels) in enumerate(train_loader): images, labels images.to(device), labels.to(device) optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() running_loss loss.item() _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() if batch_idx % 100 0: print(fTrain Epoch: {epoch} [{batch_idx * len(images)}/{len(train_loader.dataset)} f({100. * batch_idx / len(train_loader):.0f}%)]\tLoss: {loss.item():.6f}) avg_loss running_loss / len(train_loader) accuracy 100. * correct / total return avg_loss, accuracy关键步骤我用一句话串起来optimizer.zero_grad()清空上一步的梯度loss.backward()反向传播计算每个参数的梯度optimizer.step()用优化器更新参数。这三行代码是PyTorch训练循环的铁三角缺一不可。4.2 优化器选择与学习率设置SGD还是AdamLeNet-5原论文时代用的是随机梯度下降SGD配合固定学习率。在现代PyTorch实现中你有两个主流选择SGD附带动量或者Adam。我做过的多次对比实验结果如下优化器学习率动量收敛速度最终准确率约SGD0.010.9较慢98.9%SGD0.10.9较快99.0%Adam0.001-快99.1%Adam0.01-快但震荡97.8%结论很明确Adam在默认学习率0.001下既快又稳适合新手省心跑通SGD需要调大学习率到0.1才能达到接近效果。但从理解的深度来说我建议你在跑通Adam版本后再手动把优化器换成SGD动量optim.SGD(model.parameters(), lr0.1, momentum0.9)感受一下两种优化器的收敛曲线差异。这种对比带来的直观理解是任何书本文字都无法替代的。我的实现选用了Adamoptimizer optim.Adam(model.parameters(), lr0.001) criterion nn.CrossEntropyLoss()4.3 训练超参数的确定epochs设为多少合适MNIST训练中epochs的典型设置是5到15。我一开始习惯设10但后来发现一个值得记录的现象LeNet-5在MNIST上第2个epoch准确率就能超过98%第5个epoch基本逼近99%之后再增加epochs收益极小。下面是我一次典型训练过程的真实记录Epoch训练损失训练准确率测试准确率10.137296.0%97.5%20.041098.8%98.7%30.028599.1%99.0%40.021099.3%99.0%50.016999.5%99.1%可以看到从第3个epoch之后模型几乎进入平台期。因此如果你只是验证网络能否工作5个epoch足够如果想追求极致的准确率并学习学习率衰减再跑更多epoch绑上StepLR调度器也不迟。4.4 设备选择CPU跑得动吗MNIST图片尺寸小、网络结构浅、参数量只有6万所以这个项目在CPU上完全可以训练。我测试过在普通的四核CPU上每个epoch大约需要20到40秒5个epoch只要两分钟左右。用GPU的话单epoch时间可以压缩到5秒以内。如果你有GPU只需在模型和batch数据上调用.to(device)即可device torch.device(cuda if torch.cuda.is_available() else cpu) model LeNet5().to(device)注意images.to(device)和labels.to(device)必须写对否则会报Expected all tensors to be on the same device的错误。5. 测试与评估准确率之外还要看什么5.1 标准测试流程model.eval()和torch.no_grad()缺一不可训练完成之后测试流程是验证模型真实效果的关键环节。我第一次写测试代码时没有用model.eval()结果测试准确率出现了诡异波动——后来才明白模型中如果有Dropout或BatchNorm层训练和测试时的行为是不同的。LeNet-5本身没有这两个层但养成写model.eval()和torch.no_grad()的习惯非常重要。标准测试函数def evaluate(model, test_loader, device): model.eval() correct 0 total 0 test_loss 0.0 criterion nn.CrossEntropyLoss() with torch.no_grad(): for images, labels in test_loader: images, labels images.to(device), labels.to(device) outputs model(images) test_loss criterion(outputs, labels).item() _, predicted torch.max(outputs, 1) total labels.size(0) correct (predicted labels).sum().item() accuracy 100. * correct / total avg_loss test_loss / len(test_loader) print(fTest set: Average loss: {avg_loss:.4f}, Accuracy: {correct}/{total} ({accuracy:.2f}%)) return accuracytorch.no_grad()是推理阶段的必备操作告诉PyTorch不需要构建计算图因为测试阶段不需要反向传播。这能显著减少显存/内存占用并加快计算速度。用torch.max(outputs, 1)取出每个样本最大分数所在的索引就是模型的预测类别。5.2 混淆矩阵哪一个数字最容易混淆准确率只是一个笼统指标。真正想了解模型在哪些地方犯错必须看混淆矩阵。我用sklearn.metrics.confusion_matrix输出过一轮结果最有价值的发现是LeNet-5最容易混淆的类别组合是4和9其次是7和2以及3和8。这跟人类手写数字的视觉相似性高度一致——4和9的写法在模糊情况下确实容易看走眼。通过分析混淆矩阵你可以定位模型的薄弱类别并针对性地扩充这类样本或者调整训练策略。这一步对理解模型行为远比单一准确率有价值。5.3 可视化把预测错的样本画出来看看另一个让我收获很大的操作是可视化错误样本。做法很简单从测试集中挑出预测错误的图片用matplotlib画出来旁边标注真实标签和预测标签。import matplotlib.pyplot as plt import numpy as np def show_misclassified(model, test_loader, device, num_images10): model.eval() misclassified [] with torch.no_grad(): for images, labels in test_loader: images, labels images.to(device), labels.to(device) outputs model(images) _, preds torch.max(outputs, 1) for i in range(len(labels)): if preds[i] ! labels[i]: misclassified.append((images[i].cpu(), labels[i].item(), preds[i].item())) if len(misclassified) num_images: break fig, axes plt.subplots(2, 5, figsize(12, 5)) for idx, (img, true_label, pred_label) in enumerate(misclassified[:num_images]): ax axes[idx // 5, idx % 5] ax.imshow(img.squeeze(), cmapgray) ax.set_title(fTrue: {true_label}, Pred: {pred_label}) ax.axis(off) plt.show()我观察下来错误样本很多是笔迹潦草、断笔、或者倾斜角度过大的手写体这让我直观感受到模型与人类视觉系统的差异模型看到的只是像素统计模式而不是人类理解中的形状。这种具象认知对后续设计更复杂网络时会很有帮助。6. 从85%到99.2%我踩过坑后的调优实录6.1 第一次训练网络不收敛到最终调优的全过程我见过太多人卡在整个项目的第一步所以想完整回顾一下自己从失败到成功的调试链路。第一次实现时我的准确率只有85%左右远达不到预期。问题排查过程如下每一步都值得你复现一遍第一步检查损失函数是否下降。如果训练loss不减反增或震荡多半是学习率过大或代码逻辑有误。我当时loss能稳定下降排除这个问题。第二步检查输出层维度。我把fc3误写为nn.Linear(84, 1)导致输出是一个单一数值而不是10类概率分布损失计算报错后我才发现。这个错误很基础但恰好说明理清维度的重要性。第三步也是最隐蔽的一个问题我一开始没有model.train()和model.eval()切换BatchNorm层当时的LeNet变体在测试时行为错乱导致验证结果忽高忽低。后来严格遵循这两个调用问题立即消除。真正让我从85%提升到99.2%的关键操作是三个一是确保训练集数据加载时shuffleTrue避免同类数字聚集出现导致梯度更新方向偏斜二是学习率从默认0.01降到0.001让Adam收敛更稳定三是在数据管道中加上归一化把输入分布拉到标准正态范围。这三个调整叠加后模型的测试准确率直接跨越到了99%以上。6.2 常见坑位清单为什么照抄代码还是报错即便照着别人的完整代码抄新手依然容易在几个固定位置翻车。我把高频错误全部列出来维度不匹配报错卷积层输出展平后是16×5×5400fc1输入维度必须写400。我曾见过有人写成16 * 4 * 4 256实际是核尺寸计算错误。CUDA/CPU设备不一致模型和数据分别留在不同设备报错信息很直白但新手容易忽略。Windows多进程数据加载卡死num_workers设为非0时可能报BrokenPipe错误最简单的解法是设为0。数据集路径重复下载每次运行都再次下载占用时间建议确认./data/MNIST/raw目录下文件完整。忘记model.eval()测试结果波动、准确率异常低时优先检查这一行。验证集和测试集混用我见过同学拿train_loader去评估模型看到99.9%准确率激动半天直到发现他用的是训练集本身。评估必须用模型没见过的数据。6.3 模型的最终性能与保存加载训练完成后保存模型的正确姿势有两种。第一种是保存整个模型torch.save(model, lenet5_mnist.pth)第二种是只保存状态字典这是推荐做法torch.save(model.state_dict(), lenet5_mnist_state_dict.pth) # 加载时先实例化网络再load_state_dict model LeNet5() model.load_state_dict(torch.load(lenet5_mnist_state_dict.pth)) model.eval()注意加载后要调用model.eval()切换到推理模式。我个人最终模型在测试集上的典型结果准确率99.2%左右测试集损失约0.02。6.4 后续你可以尝试的3个改进方向跑通这个项目之后如果你想进一步进阶我按难度从小到大推荐三个扩展方向。第一调换激活函数进行A/B对比或者尝试不同的池化方式观察准确率和收敛速度的差异。这类实验成本极低但能让你建立对每个组件作用的直觉。第二加一个Dropout层放到fc1之后设置p0.5体验它对过拟合的抑制作用。虽然MNIST上LeNet-5的过拟合表现不算严重但你能直观感受到正则化带来的泛化改善。第三改造网络结构比如把卷积核数量翻倍、增加一个卷积层观察参数量增加对效果的影响。这一步能让你切身体会网络容量与泛化能力之间的权衡。写在最后的一点建议从跑通代码到理解原理再到能独立调优我从这个项目中学到最多的并不是那几个经典层结构而是一套看数据、看损失、看错误样例的调试思维。LeNet-5在MNIST上轻松刷到99%以上反而让你有足够精力去观察那些剩余的1%错误——真正拉开一个工程师和调包侠差距的往往就是那1%的分析深度。如果你是初学者试试把每一层输出shape打印一遍把每个超参数改乱一次看看会发生什么你会比看十遍教程收获更大。

相关新闻

LCD1602+C51驱动例程:从显示时序到传感器联动开发

LCD1602+C51驱动例程:从显示时序到传感器联动开发

简介:一套针对LCD1602与C51单片机的综合显示例程,面向电子设计初学者与嵌入式入门者,解决字符液晶显示与常见外设的编程交互问题。例程共86个文件、压缩包4.13MB,主体为C语言源码、Keil工程文件与Proteus仿真设计,并附…

2026/10/17 7:26:09 阅读更多 →
LCD1602+C51显示例程:驱动、避坑及DS18B20/DS1302扩展

LCD1602+C51显示例程:驱动、避坑及DS18B20/DS1302扩展

简介:LCD1602与C51单片机结合的显示例程包,面向单片机初学者与电子制作爱好者,集中展示字符液晶屏在典型嵌入式场景中的驱动方法。压缩包共86个文件,约4.13MB,包含4个独立工程:矩阵按键键值显示、DS18B20温…

2026/10/17 7:26:09 阅读更多 →
C51单片机LCD1602显示例程:集成DS18B20测温与DS1302时钟

C51单片机LCD1602显示例程:集成DS18B20测温与DS1302时钟

简介:LCD1602与C51单片机结合的显示例程包含矩阵按键键值、DS18B20温度、DS1302时间、ADC0832电压四个实践项目,面向单片机初学者及电子竞赛备赛者,帮助理解字符液晶驱动和常用外设接口。压缩包共86个文件,以C源码、Keil工程文件、…

2026/10/17 7:26:09 阅读更多 →

最新新闻

改进型永磁同步电机DTC仿真模型:滞环与SVPWM转矩脉动抑制对比

改进型永磁同步电机DTC仿真模型:滞环与SVPWM转矩脉动抑制对比

简介:一套面向电机控制研究人员与电气工程专业学生的永磁同步电机(PMSM)直接转矩控制(DTC)改进版Simulink仿真模型,涵盖从电机本体、转矩磁链估算到滞环控制器与逆变器开关逻辑的完整闭环结构。压缩包共包含…

2026/10/17 8:04:16 阅读更多 →
AI生成式美术与手工版画融合:ArtCraft文创落地全流程解析

AI生成式美术与手工版画融合:ArtCraft文创落地全流程解析

做文创这行,最尴尬的不是没想法,而是想法到了落地环节全变味。我去年接手一个节气主题的明信片设计,AI生成的概念草图一张比一张惊艳,结果打印机一跑,边缘假滑得像个塑料玩具,纸张纹理全部丢失,…

2026/10/17 8:04:16 阅读更多 →
artcraft手作材料包全流程指南:从设计稿到量产售卖

artcraft手作材料包全流程指南:从设计稿到量产售卖

最近常有人问我,artcraft到底是什么。说实话,它不是一个能一句话讲清楚的软件,也不是某个平台的固定栏目。artcraft是我给自己一堆手作实验起的项目代号,ar t 和 craft 拼在一起,听起来像“艺术手工”,但更…

2026/10/17 8:04:16 阅读更多 →
大模型微调过拟合怎么办?三招实战反过拟合方案

大模型微调过拟合怎么办?三招实战反过拟合方案

直接用一句话说完:大模型过拟合不是它笨,是你没给它“开卷考之外的新题”。这是我在多次微调实验里最强烈的感受——训练集准确率一路冲到99.8%,验证集却卡在71%,一翻训练日志,loss曲线优雅得近乎完美,可一…

2026/10/17 8:04:16 阅读更多 →
《artcraft》:以艺术与工艺为核心的建造游戏设计与技术解析

《artcraft》:以艺术与工艺为核心的建造游戏设计与技术解析

不需要过分解读这个标题,它的字面意思就是“艺术工艺”。我基于这个理解,把它当作一款独立游戏项目的名称来处理,围绕其核心玩法、技术实现和创作理念展开。以下为博文正文。1. 项目缘起:为什么想做一个“艺术工坊”式的建造游戏说…

2026/10/17 8:04:16 阅读更多 →
算子与运行时:AI系统稳定性的底层契约

算子与运行时:AI系统稳定性的底层契约

1. 这不是“语法糖”,而是系统级能力的分水岭很多人第一次看到“算子(Operator)”这个词,是在深度学习框架的文档里——比如 PyTorch 的torch.add、TensorFlow 的tf.matmul,或者 ONNX 模型里的Add、MatMul节点。于是下…

2026/10/17 8:03:16 阅读更多 →

日新闻

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 阅读更多 →