手写数字识别毕业设计:从MNIST到答辩完整交付物
简介这份资源面向计算机相关专业的本科生提供一套可直接用于毕业设计、期末大作业或课程设计的手写数字识别完整方案帮助解决选题难、代码跑不通、论文与答辩材料无从下手的实际问题。压缩包共28个文件约29.22MB包含Python源码、预训练模型权重与索引文件、前端页面资源以及docx、pdf、doc等论文与文档材料覆盖从代码实现到论文撰写的完整链路。项目基于Python实现手写数字识别代码注释详尽新手也能看懂经过严格调试可稳定运行部署简单。资源内含开题报告、任务书、外文翻译、论文正文及答辩PPT等文档配合源码与模型文件读者可快速理解识别流程、复用目录结构并完成自己的毕设材料。目前已有241人学习下载适合需要高分毕设参考的学生使用。1. 手写数字识别毕业设计从 MNIST 到能答辩的完整交付物很多同学做毕业设计时第一反应是去 GitHub 找一个 mnist 手写数字识别项目跑通train.py看到准确率 98% 就以为完事了结果答辩时老师问「你的数据怎么预处理的」「为什么用这个网络结构」「界面怎么和模型对接」直接卡壳。这个标题真正要交付的不是一个能跑的脚本而是一套完整的毕业设计材料python 源码、论文、答辩 PPT、文档资料四样缺一不可。手写数字识别本身是深度学习入门最经典的场景MNIST 数据集小、训练快、效果直观非常适合作为计算机毕业设计的选题。但「高分项目」和「及格项目」的差距往往不在模型本身而在于工程完整度和文档质量。这篇文章会从零拆解一套可复现的手写数字识别毕业设计怎么做包括环境搭建、模型训练、GUI 界面、论文结构、答辩准备以及那些只有真正做过的人才知道的坑。2. 环境搭建与 MNIST 数据准备别在第一步就翻车2.1 python 安装与依赖库的版本选择做这个项目python 版本建议锁定在 3.8 到 3.10 之间。太新的版本比如 3.12在安装 TensorFlow 或 PyTorch 时经常遇到 wheel 包还没适配的问题尤其是 Windows 环境下。我一般会推荐用 Anaconda 来管理环境因为毕业设计涉及的不只是训练还有 GUI通常用 PyQt5 或 Tkinter和论文绘图matplotlibconda 能把这些依赖隔离得比较干净。安装完 python 后核心依赖就几个深度学习框架选 PyTorch 或 TensorFlow 都行但如果你论文里要写「基于卷积神经网络」PyTorch 的代码可读性更好答辩时也更容易讲清楚每一层在做什么。GUI 部分用 PyQt5 做出来的界面比 Tkinter 好看不少答辩演示时加分。绘图用 matplotlib数据处理用 numpy。# 创建虚拟环境推荐 python 3.9 conda create -n mnist_demo python3.9 conda activate mnist_demo # 安装核心依赖 pip install torch torchvision --index-url https://download.pytorch.org/whl/cpu pip install PyQt5 matplotlib numpy pillow这里有个细节如果你电脑没有 NVIDIA 显卡直接装 CPU 版本的 PyTorch 就行MNIST 这种小数据集 CPU 训练也就几分钟的事没必要折腾 CUDA。很多同学在 CUDA 安装上卡了两三天最后发现根本用不上这是典型的血泪经验。2.2 MNIST 数据集的加载与预处理MNIST 包含 60000 张训练图和 10000 张测试图每张是 28x28 的灰度图对应 0-9 十个数字。用 torchvision 加载非常方便但有几个预处理步骤必须做对否则模型效果会差很多。import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader # 定义预处理转张量 标准化 transform transforms.Compose([ transforms.ToTensor(), # 将 PIL 图像转为 [0,1] 的张量 transforms.Normalize((0.1307,), (0.3081,)) # MNIST 全局均值和标准差 ]) # 加载训练集和测试集 train_dataset datasets.MNIST(root./data, trainTrue, downloadTrue, transformtransform) test_dataset datasets.MNIST(root./data, trainFalse, downloadTrue, transformtransform) # 创建数据加载器 train_loader DataLoader(train_dataset, batch_size64, shuffleTrue) test_loader DataLoader(test_dataset, batch_size1000, shuffleFalse)Normalize里的 0.1307 和 0.3081 是 MNIST 数据集的全局均值和标准差这两个数字是固定的直接用就行。很多教程会跳过标准化这一步模型也能收敛但加上之后训练更稳定论文里写出来也显得更专业。batch_size训练时设 64 比较合适测试时可以设大一点比如 1000加快评估速度。提示第一次运行downloadTrue会从网络下载 MNIST 数据到./data目录大概 11MB。如果下载慢可以手动下载后放到对应目录或者换用国内镜像源。2.3 数据可视化答辩 PPT 里必须有的一张图论文和答辩 PPT 里如果只有准确率数字会显得很干。建议做一张数据样本可视化图展示每个数字类别的几个样本。这个用 matplotlib 几行代码就能搞定放在论文的「数据集介绍」章节里非常合适。import matplotlib.pyplot as plt import numpy as np # 取一个 batch 的数据 dataiter iter(train_loader) images, labels next(dataiter) # 展示前 10 张图 fig, axes plt.subplots(2, 5, figsize(10, 4)) for i, ax in enumerate(axes.flat): ax.imshow(images[i].squeeze(), cmapgray) ax.set_title(fLabel: {labels[i].item()}) ax.axis(off) plt.tight_layout() plt.savefig(mnist_samples.png, dpi150) plt.show()这段代码生成的图可以直接放进论文标注清楚「图 3-1 MNIST 数据集样本示例」。答辩时老师看到你有数据探索的过程印象分会高不少。3. CNN 模型设计与训练准确率从 92% 到 99% 的关键调整3.1 网络结构选型为什么用两层卷积而不是全连接手写数字识别最简单的做法是用全连接网络MLP把 28x28 拉成 784 维向量接几个隐藏层。这种做法准确率大概能到 97% 左右但论文里写「基于全连接神经网络」听起来就比较普通。用卷积神经网络CNN不仅准确率能到 99% 以上而且论文里可以展开讲卷积层、池化层、特征提取这些概念内容更充实。我一般用的结构是两个卷积层 两个池化层 两个全连接层。具体来说第一层卷积用 32 个 3x3 的卷积核接 ReLU 激活和 2x2 最大池化第二层卷积用 64 个 3x3 卷积核同样接 ReLU 和池化然后展平接一个 128 维的全连接层最后输出 10 维对应 0-9。这个结构参数量不大训练快效果也好。import torch.nn as nn import torch.nn.functional as F class CNN(nn.Module): def __init__(self): super(CNN, self).__init__() # 第一层卷积输入 1 通道输出 32 通道卷积核 3x3 self.conv1 nn.Conv2d(1, 32, kernel_size3, padding1) # 第二层卷积输入 32 通道输出 64 通道 self.conv2 nn.Conv2d(32, 64, kernel_size3, padding1) # 池化层2x2 最大池化 self.pool nn.MaxPool2d(2, 2) # 全连接层经过两次池化后28x28 变成 7x7通道数 64 self.fc1 nn.Linear(64 * 7 * 7, 128) self.fc2 nn.Linear(128, 10) self.dropout nn.Dropout(0.25) # 防止过拟合 def forward(self, x): x self.pool(F.relu(self.conv1(x))) # 28x28 - 14x14 x self.pool(F.relu(self.conv2(x))) # 14x14 - 7x7 x x.view(-1, 64 * 7 * 7) # 展平 x F.relu(self.fc1(x)) x self.dropout(x) x self.fc2(x) return xpadding1是为了保持卷积后尺寸不变这样两次池化后刚好从 28 降到 7。Dropout(0.25)在全连接层前随机丢弃 25% 的神经元能有效防止过拟合论文里也可以作为一个优化点来写。3.2 训练循环与超参数设置训练部分的核心是定义损失函数、优化器然后写训练循环。损失函数用交叉熵CrossEntropyLoss优化器用 Adam学习率设 0.001。训练轮数一般 5 到 10 轮就够了MNIST 很容易收敛。import torch.optim as optim device torch.device(cuda if torch.cuda.is_available() else cpu) model CNN().to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lr0.001) def train(epoch): model.train() for batch_idx, (data, target) in enumerate(train_loader): data, target data.to(device), target.to(device) optimizer.zero_grad() output model(data) loss criterion(output, target) loss.backward() optimizer.step() 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: data, target data.to(device), target.to(device) output model(data) test_loss criterion(output, target).item() pred output.argmax(dim1) correct pred.eq(target).sum().item() acc 100. * correct / len(test_loader.dataset) print(fTest Accuracy: {acc:.2f}%) return acc for epoch in range(1, 6): train(epoch) test()学习率 0.001 是 Adam 的经典设置不用怎么调。batch_idx % 100 0是每 100 个 batch 打印一次 loss方便观察训练是否正常。如果 loss 一直不下降大概率是学习率太大或者数据预处理有问题。训练 5 轮后测试准确率通常能到 99% 左右如果只有 97% 以下检查一下是否漏了标准化或者网络结构写错了。3.3 模型保存与加载答辩演示的后悔药训练完一定要把模型参数保存下来不然每次演示都要重新训练浪费时间。PyTorch 保存模型有两种方式保存整个模型结构或者只保存参数。推荐只保存参数state_dict加载时先实例化模型再加载参数这样更灵活。# 保存模型参数 torch.save(model.state_dict(), mnist_cnn.pth) # 加载模型参数演示时用 model CNN().to(device) model.load_state_dict(torch.load(mnist_cnn.pth, map_locationdevice)) model.eval()map_locationdevice这个参数很关键。如果你在 GPU 上训练保存的模型拿到没有 GPU 的电脑上演示不加这个参数会报错。答辩现场电脑配置不确定这个细节能救你一命。4. GUI 界面开发与系统集成让答辩老师看到「完整系统」4.1 PyQt5 界面布局与手写板实现毕业设计如果只有一个命令行脚本答辩时演示效果会很差。加一个 GUI 界面让老师能直接在界面上手写数字然后点击识别整个项目的完成度就上了一个档次。PyQt5 是实现这个需求最成熟的方案。界面布局我一般分成三块左边是手写板一个空白的白色画布右边是识别结果展示区底部是「识别」和「清空」两个按钮。手写板用 QPixmap 实现鼠标按下和移动时记录轨迹并绘制。from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QVBoxLayout, QHBoxLayout, QPushButton, QLabel from PyQt5.QtGui import QPainter, QPen, QPixmap, QImage from PyQt5.QtCore import Qt, QPoint import sys class DrawingBoard(QWidget): def __init__(self): super().__init__() self.setFixedSize(280, 280) self.pixmap QPixmap(280, 280) self.pixmap.fill(Qt.white) self.last_point QPoint() self.drawing False def mousePressEvent(self, event): if event.button() Qt.LeftButton: self.drawing True self.last_point event.pos() def mouseMoveEvent(self, event): if self.drawing: painter QPainter(self.pixmap) pen QPen(Qt.black, 15, Qt.SolidLine, Qt.RoundCap, Qt.RoundJoin) painter.setPen(pen) painter.drawLine(self.last_point, event.pos()) self.last_point event.pos() self.update() def mouseReleaseEvent(self, event): self.drawing False def paintEvent(self, event): painter QPainter(self) painter.drawPixmap(0, 0, self.pixmap) def clear(self): self.pixmap.fill(Qt.white) self.update() def get_image(self): # 将 QPixmap 转为 numpy 数组供模型使用 image self.pixmap.toImage().convertToFormat(QImage.Format_Grayscale8) ptr image.bits() ptr.setsize(image.byteCount()) arr np.frombuffer(ptr, np.uint8).reshape((280, 280)) return arr画笔粗细设 15 像素是因为 MNIST 里的数字笔画比较粗太细的线条模型识别效果不好。Qt.RoundCap和Qt.RoundJoin让线条端点圆滑更接近真实手写效果。4.2 手写图像预处理与模型推理对接手写板拿到的是 280x280 的灰度图但模型需要的是 28x28 且经过标准化的张量。中间需要做缩放、居中、反色等处理。这一步是 GUI 和模型对接最容易出问题的地方。import cv2 import numpy as np def preprocess_image(img_array): # 反色手写板是白底黑字MNIST 是黑底白字 img 255 - img_array # 找到数字的边界框并裁剪 coords cv2.findNonZero(img) if coords is None: return None x, y, w, h cv2.boundingRect(coords) roi img[y:yh, x:xw] # 缩放到 20x20保持比例 if w h: new_w 20 new_h int(h * 20 / w) else: new_h 20 new_w int(w * 20 / h) roi cv2.resize(roi, (new_w, new_h), interpolationcv2.INTER_AREA) # 放到 28x28 画布中央 canvas np.zeros((28, 28), dtypenp.uint8) x_offset (28 - new_w) // 2 y_offset (28 - new_h) // 2 canvas[y_offset:y_offsetnew_h, x_offset:x_offsetnew_w] roi # 归一化并标准化 canvas canvas.astype(np.float32) / 255.0 canvas (canvas - 0.1307) / 0.3081 return canvas.reshape(1, 1, 28, 28)这段预处理逻辑是整套代码里最核心的部分。cv2.findNonZero找到数字的边界框裁剪后缩放到 20x20再放到 28x28 画布中央这样和 MNIST 的数据分布一致。如果不做居中处理手写数字偏左或偏右识别率会明显下降。反色那一步也很关键忘了做的话模型会把白底黑字当成黑底白字识别结果全是错的。4.3 识别结果展示与置信度输出识别按钮点击后调用模型推理把结果显示在界面上。除了显示识别出的数字建议把置信度也显示出来答辩时更有说服力。def recognize(self): img_array self.board.get_image() processed preprocess_image(img_array) if processed is None: self.result_label.setText(请先手写一个数字) return tensor torch.from_numpy(processed).to(device) with torch.no_grad(): output model(tensor) prob torch.softmax(output, dim1) pred output.argmax(dim1).item() confidence prob[0][pred].item() * 100 self.result_label.setText(f识别结果: {pred}\n置信度: {confidence:.2f}%)torch.softmax把输出转成概率分布取最大概率对应的类别作为预测结果。置信度显示出来如果低于 80% 可以提示用户重新书写这样交互更友好。5. 论文写作与答辩 PPT高分项目的另一半5.1 论文结构模板与各章节写作要点毕业设计论文一般要求 8000 到 15000 字结构上通常包括绪论、相关技术介绍、系统设计、系统实现、系统测试、总结与展望。手写数字识别项目的论文重点应该放在「系统设计」和「系统实现」两章这两章要写清楚你的网络结构为什么这么设计、GUI 怎么和模型对接、预处理做了哪些操作。绪论部分不要抄太多背景简单说清楚手写数字识别的应用场景和研究意义就行。相关技术介绍里卷积神经网络、PyTorch 框架、PyQt5 这些都要提到但不要写成教科书每部分两三段带过重点放在「我为什么选这个技术」。系统设计章节要有架构图可以用 Visio 或 draw.io 画把数据流从输入到输出画清楚。系统实现章节要贴关键代码但不要贴全部代码挑核心的贴每段代码下面解释逻辑。系统测试章节要有准确率曲线、混淆矩阵、界面截图数据越丰富越好。5.2 答辩 PPT 的 10 页结构与演示流程答辩 PPT 不要超过 15 页10 页左右最合适。我一般按这个结构来封面、选题背景与意义、技术路线、数据集介绍、网络结构设计、训练过程与结果、GUI 界面展示、系统测试、创新点与不足、致谢。其中「网络结构设计」和「GUI 界面展示」是重点各占两页。答辩演示流程要提前排练。一般先打开 PPT 讲 5 到 8 分钟然后切换到系统界面演示。演示时先手写一个清晰的数字比如「8」点击识别展示结果和置信度。再手写一个稍微潦草的「3」展示系统的鲁棒性。如果时间允许可以展示一下训练过程的 loss 曲线和准确率曲线。老师提问环节常见问题包括「为什么用 CNN 不用 RNN」「数据增强做了没有」「过拟合怎么处理的」「系统能不能识别多个数字」这些都要提前准备好答案。注意答辩现场电脑可能没有 python 环境建议提前打包成 exe 或者准备好录屏视频作为备用方案。用 PyInstaller 打包时注意把模型文件一起打包进去。6. 避坑与常见问题排查6.1 训练 loss 不下降或准确率卡在 10%现象训练几轮后 loss 一直在 2.3 左右准确率 10% 上下相当于随机猜。 原因最常见的是数据标签没对齐或者损失函数用错。MNIST 标签是 0-9 的整数CrossEntropyLoss 要求标签是 LongTensor 类型如果标签是 float 会报错或者计算出错。另一个可能是学习率太大导致梯度爆炸。 解决检查target的数据类型确保是torch.long。学习率从 0.001 开始试如果 loss 震荡就降到 0.0001。另外检查一下optimizer.zero_grad()有没有漏掉梯度累积也会导致训练异常。6.2 GUI 手写数字识别结果总是不对现象界面上写的数字明明很清晰但识别结果乱七八糟。 原因预处理没做对。最常见的是忘了反色或者缩放时没有保持比例导致数字变形或者没有居中处理。 解决把预处理后的 28x28 图像用 matplotlib 显示出来和 MNIST 的样本对比。如果背景是白色、数字是黑色说明忘了反色。如果数字偏在角落说明没做居中。如果数字被拉伸变形说明缩放时没保持宽高比。这一步排查清楚了识别率立刻恢复正常。6.3 模型在测试集上准确率 99% 但实际手写识别很差现象测试集准确率很高但自己在界面上写的数字识别不出来。 原因训练数据和实际手写数据分布不一致。MNIST 是美国人手写的笔画粗细、倾斜角度和中国人手写习惯有差异。另外测试集和训练集来自同一分布所以准确率高不代表泛化到真实场景。 解决在预处理阶段做数据增强比如随机旋转、平移、缩放让模型见到更多变化。另外可以在 GUI 里加一个「保存当前手写样本」的功能收集一些自己的手写数据微调模型。答辩时如果老师问起这也是一个很好的「不足与展望」点。6.4 PyInstaller 打包后运行报错找不到模型文件现象python 脚本运行正常打包成 exe 后双击闪退或者提示FileNotFoundError。 原因PyInstaller 打包后程序运行时的临时目录和脚本目录不一致用相对路径加载模型文件会找不到。 解决用sys._MEIPASS获取临时目录把模型文件路径改成绝对路径。或者在打包时用--add-data参数把模型文件一起打包进去。import sys import os def resource_path(relative_path): if hasattr(sys, _MEIPASS): return os.path.join(sys._MEIPASS, relative_path) return os.path.join(os.path.abspath(.), relative_path) model.load_state_dict(torch.load(resource_path(mnist_cnn.pth), map_locationdevice))6.5 答辩时被问「你的创新点是什么」答不上来现象老师问创新点只能回答「用了 CNN」显得很单薄。 原因毕业设计不要求真正的学术创新但要有「工程改进」或「应用扩展」。 解决提前准备几个可以说的点。比如「在预处理阶段加入了自动居中和尺寸归一化提高了实际手写场景的识别率」「在 GUI 中加入了置信度显示和低置信度提示提升了用户体验」「对比了 MLP 和 CNN 的效果验证了卷积结构在图像任务上的优势」。这些虽然不是学术创新但作为工程实践中的改进点答辩时完全站得住脚。7. 让项目真正拿高分的三个进阶技巧第一个技巧是做一个对比实验。不要只跑一个 CNN 模型就完事把 MLP、CNN、以及加了数据增强的 CNN 放在一起对比用表格展示准确率和训练时间。论文里有了对比实验工作量看起来就扎实很多。具体做法是写一个统一的训练函数传入不同的模型和数据加载器跑三次记录结果。这个表格放在论文的「系统测试」章节答辩 PPT 里也放一页老师一眼就能看到你做了多少工作。第二个技巧是给系统加一个「批量测试」功能。在 GUI 里加一个按钮点击后自动从测试集里随机抽取 100 张图片逐张识别并统计准确率把结果展示在界面上。这个功能实现起来不难但演示效果很好能证明你的系统不是只能识别手写的单张图片而是有完整的评估能力。def batch_test(self): model.eval() correct 0 total 100 with torch.no_grad(): for i in range(total): img, label test_dataset[i] img img.unsqueeze(0).to(device) output model(img) pred output.argmax(dim1).item() if pred label: correct 1 acc correct / total * 100 self.result_label.setText(f批量测试 {total} 张\n准确率: {acc:.1f}%)第三个技巧是准备一份「项目说明文档」。这份文档不用太长5 到 8 页就行内容包括项目结构说明、环境配置步骤、运行方法、常见问题。答辩时如果老师问「你这个项目别人能不能跑起来」直接把文档递上去比口头解释有说服力得多。文档用 Markdown 写导出成 PDF 放在项目根目录和源码、论文、PPT 一起打包提交。我自己做毕业设计时最大的教训是前期花太多时间调模型后期赶论文和 PPT 赶到凌晨。模型准确率从 98% 提到 99% 花了两天但论文初稿只留了三天最后答辩 PPT 是答辩前一晚才定稿。如果重来一次我会先把论文框架搭好模型训练和论文写作同步进行这样时间分配更合理。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Spring Boot+Vue招聘系统实战:从表结构到权限控制

Spring Boot+Vue招聘系统实战:从表结构到权限控制

开发过招聘类系统的同学应该都有同感:这类项目的业务链路不算复杂,但角色多、状态多、权限多,一旦设计没想清楚,后期很容易陷入改表、加接口、调联调的循环。基于Spring Boot Vue的大学生就业招聘系统,就是典型的前后…

2026/10/11 16:48:53 阅读更多 →
深耕江浙沪,铸就金属材料展厅标杆:上海点山展示的“智能+绿色+科创”实践

深耕江浙沪,铸就金属材料展厅标杆:上海点山展示的“智能+绿色+科创”实践

深耕江浙沪,铸就金属材料展厅标杆:上海点山展示的“智能绿色科创”实践扎根产业高地,服务龙头企业的展示需求江浙沪地区是中国先进制造业与民营经济的策源地,汇聚了众多在全球产业链中占据重要地位的上市龙头企业。这些企业不仅追…

2026/10/11 16:48:53 阅读更多 →
基于机器学习的口碑商家客流量预测:SVM实战与避坑指南

基于机器学习的口碑商家客流量预测:SVM实战与避坑指南

简介:这份资源面向参加天池IJCAI17口碑商家客流量预测赛题的选手,以及希望用机器学习方法解决真实商业预测问题的开发者与数据科学学习者。内容围绕客流量预测这一典型回归任务,提供从数据预处理、特征工程到模型训练与结果调整的完整实现思路…

2026/10/11 16:48:53 阅读更多 →

最新新闻

手写文字去除:OCR前图像预处理的可控方案

手写文字去除:OCR前图像预处理的可控方案

简介:本资源提供手写文字智能擦除的工业级Python实现方案,面向图像处理开发者、AI算法工程师及教育信息化从业者,解决试卷、表单等场景中手写内容与印刷体混杂导致的OCR识别干扰问题。资源包共36个文件,含22个核心Python脚本&…

2026/10/11 17:43:28 阅读更多 →
响应头里藏flag?从“迅疾响应”看CTF信息收集与源码审计

响应头里藏flag?从“迅疾响应”看CTF信息收集与源码审计

前几天一个刚入门的朋友在CTFshow上刷“菜狗杯”的新手题,卡在了一道叫“迅疾响应”的题目上。他跑来跟我说:页面就一行字,啥提示都没有,不知道从哪下手。我让他把浏览器开发者工具打开,先别碰页面内容,去翻…

2026/10/11 17:43:28 阅读更多 →
GemPy隐式地质建模实战:从数据准备到MCMC不确定性分析

GemPy隐式地质建模实战:从数据准备到MCMC不确定性分析

简介:GemPy是基于Python的开源隐式3D结构地质建模库,它利用界面与方向数据自动构建褶皱、断层网络和不整合面等复杂地质结构,避免了传统显式建模的繁杂几何操作,并支持贝叶斯推断与蒙特卡洛随机模拟以量化参数和模型不确定性&…

2026/10/11 17:43:27 阅读更多 →
Sourcetree重置操作全解析:soft、mixed、hard三种模式与恢复技巧

Sourcetree重置操作全解析:soft、mixed、hard三种模式与恢复技巧

1. 重置操作到底在重置什么:先搞懂Git的“后悔药”体系在聊Sourcetree之前,先说说我为什么总会写到这个主题。Git用久了你会发现,真正让人心里发虚的操作往往不是冲突合并,而是“怎么回到过去”。提交记录删不掉、分支拉错、本地改…

2026/10/11 17:43:27 阅读更多 →
Matlab CNN图像分类实战:从数据流水线到参数调试完整指南

Matlab CNN图像分类实战:从数据流水线到参数调试完整指南

简介:这是一套基于Matlab实现的卷积神经网络图像分类项目,适合正在学习CNN原理、需要完整可运行代码进行实验的初学者,也适合有一定深度学习基础的开发人员快速迁移使用。项目覆盖数据加载、特征提取(PCA)、网络初始化…

2026/10/11 17:43:27 阅读更多 →
C#实现Excel实时导入SQL Server:NPOI+SqlBulkCopy完整方案

C#实现Excel实时导入SQL Server:NPOI+SqlBulkCopy完整方案

有段时间我接到一个需求:业务部门每天把Excel报价单丢进一个共享目录,希望系统能把新数据自动读进SQL Server,全程不靠人点按钮。听到这个需求,我的第一反应是“读个Excel写个库而已”,真动手才发现,容易的…

2026/10/11 17:42:27 阅读更多 →

日新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/11 0:00:27 阅读更多 →

月新闻

我发现了一个新思路:用 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 阅读更多 →