新闻详情

新闻详情

首页 / 资讯中心 / 详情

MNIST手写识别实战:从PyTorch环境搭建到卷积神经网络迁移

发布时间:2026/9/28 17:49:13来源:尧图网络
MNIST手写识别实战:从PyTorch环境搭建到卷积神经网络迁移
简介面向计算机、电子信息工程及数学等专业学生的深度学习入门项目基于Python实现MNIST手写数字识别覆盖卷积神经网络构建、前向/反向传播、损失计算与训练测试流程适合课程设计、期末大作业或毕业设计参考。压缩包共18个文件约19.77MB包含5个Python源码与5个pyc编译文件、3个JSON配置、MNIST训练/测试图像及标签数据idx格式和pkl数据集可结合VS Code工程配置直接阅读运行。已有511人学习下载。资源提供完整代码结构和数据读者可自行调试并扩展网络层、调整超参数或对比不同激活函数与卷积层设计理解深度学习模型在经典数据集上的完整落地路径。1. 用 MNIST 手写数据集识别给深度学习验一次身一份源码到底值不值得跑MNIST 手写数据集识别是深度学习里最“干净”的入门项目28×28 的灰度小图10 类数字训练集 6 万张测试集 1 万张没有背景干扰、没有标注歧义一张图就只有“它是几”这一个问题。任何一本讲 Python 深度学习的教材几乎都会先用它把数据加载、模型定义、训练循环、精度评估这条完整链路走通。标题里的“源码数据”压缩包拆开看就是这条链路的三个零件数据集、网络模型代码、训练与识别脚本。适合谁刚装好 Python 还不知道怎么选框架的人被 pytorch 环境配置卡住的人以及想快速判断“这套深度学习方法在真实场景里值不值得投入”的人——用 MNIST 花一小时跑通得到的不只是 99% 的准确率而是一套可以复制到仪表识别、病虫害识别等任务上的识别工作流。2. 环境与数据让源码里的 MNIST 在 PyTorch 里先跑起来拿到任何一份 MNIST 源码第一件事不是改模型而是把环境搭到能跑。这一章说的是处理这类压缩包的固定顺序先装 Python 和 PyTorch再解决 MNIST 数据从哪来最后把代码拆成数据、模型、训练三个文件每一步都能在同一台机器上验证。2.1 环境Python 3.10 与 PyTorch 2.x 的最小组合常见做法是使用 Python 3.8 以上版本如果不止为了跑 MNIST而是之后想转仪表识别、农业病虫害识别这类项目建议直接用 Python 3.10 或 3.11配套 PyTorch 2.x。MNIST 代码本身不挑版本但 torchvision 的接口几年里变过几次比如datasets.MNIST的参数校验越来越严格新版本能少踩很多坑也更容易找到对应的中文资料。安装建议用 conda 或者 venv 建独立环境不要直接装到系统 Python 里。最小依赖其实只有三个torch、torchvision、numpy。装完之后不要急着打开 Jupyter先在命令行里验证一次python -c import torch, torchvision; print(torch.__version__, torchvision.__version__); print(torch.cuda.is_available())这条命令同时做了三件事确认两个库能导入、确认版本号、确认当前机器的 CUDA 是否可用。如果torch.cuda.is_available()返回 False不用慌MNIST 这种 28×28 小图用 CPU 训练也只要几分钟一个 epoch如果返回 True下面所有训练代码可以自己决定是否把张量放到 GPU 上。硬性要求只剩一个numpy 版本不要和 torch 差太多否则会出现 “numpy.ndarray size changed” 这类导入报错解决方法是升级 numpy 到 torch 要求的版本。2.2 数据准备torchvision 下载 MNIST 报 404 的两种替代做法MNIST 源码里最常见的写法是这样from torchvision import datasets, transforms transform transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ]) train_data datasets.MNIST(root./data, trainTrue, downloadFalse, transformtransform) test_data datasets.MNIST(root./data, trainFalse, downloadFalse, transformtransform) print(len(train_data), len(test_data))把downloadTrue写进代码第一次运行时会自动去官方源拉数据。但实际跑的时候很常见的情况是torchvision 下载 MNIST 报 404卡在Downloading http://……就再也动不了后面跟着一行红字说 URL not found。原因通常是官方数据地址换过路径、部分网络环境访问官方源不稳定而不是代码写错了。我一般不会去改源码里的下载逻辑而是把download改成 False手动准备数据。MNIST 的原始格式是四个.gz文件train-images-idx3-ubyte.gz、train-labels-idx1-ubyte.gz、t10k-images-idx3-ubyte.gz、t10k-labels-idx1-ubyte.gz。去官网或者能找到的镜像把这四个文件下载下来直接放进./data/MNIST/raw/目录文件名保持原名不需要解压torchvision 读取时自己会解压。print(len(train_data), len(test_data))是关键验证train 打印 60000、test 打印 10000就说明数据放对了只要看到一个异常数字就去检查 raw 目录下文件是否完整。2.3 目录结构数据、模型、训练三层职责怎么分拿到压缩包之后第一件事是解压看文件列表。多数跑得通的 MNIST 源码会包含数据集加载、模型定义、训练循环、测试评估四块。我不会把全部代码塞进一个文件因为后面换仪表识别、口腔疾病图像识别这类真实数据集时你只想改数据加载和输出类别不想动训练循环。我一般会整理成这样的目录mnist_work/ data/ # MNIST 原始数据脚本自动下载或手动放置 model.py # 网络结构定义 train.py # 数据加载 训练 测试 predict.py # 单张图片识别脚本model.py只负责__init__和forwardtrain.py负责用DataLoader包装数据集、定义损失函数和优化器、跑循环predict.py用来事后加载模型权重对单张图做推理。把三层分开改模型不会弄乱数据流程改数据不用动网络排查问题时只需要看一个文件。注意DataLoader有两个容易被忽略的选项shuffleTrue只在训练集上用测试集不要打乱num_workers在 Windows 上如果设成大于 0经常出现多进程保护报错新手阶段直接设 0 最稳。3. 网络与训练参数把 MNIST 识别准确率从 95% 推到 99%跑通训练循环不难难的是知道每一步在改什么、为什么这样改。这一章给出一组稳定上 99% 的网络结构与参数组合并解释背后的选择逻辑。3.1 识别网络怎么选为什么 MNIST 标准做法是 CNNMNIST 图像只有 28×28像素之间的空间关联不算复杂全连接网络也能跑出 95% 左右。但它对“数字轮廓平移一格”这种变化非常敏感稍微偏移一点的数字就会认错。卷积神经网络对局部图案具有平移不变性数字的笔画像“拐角”“圆弧”“横线”这些局部特征无论出现在画面哪个位置卷积核都能捕捉到。所以 MNIST 源码里的标准做法是两个卷积层 两个池化层 两层全连接也就是 LeNet-5 的轻量简化版。一个能稳定跑到 99% 以上的结构我通常这样定义import torch import torch.nn as nn class Net(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv2d(1, 32, kernel_size3, padding1) self.bn1 nn.BatchNorm2d(32) self.conv2 nn.Conv2d(32, 64, kernel_size3, padding1) self.bn2 nn.BatchNorm2d(64) self.pool nn.MaxPool2d(2) self.fc1 nn.Linear(64 * 7 * 7, 128) self.drop1 nn.Dropout(0.25) self.fc2 nn.Linear(128, 10) def forward(self, x): x self.pool(torch.relu(self.bn1(self.conv1(x)))) x self.pool(torch.relu(self.bn2(self.conv2(x)))) x x.view(-1, 64 * 7 * 7) x torch.relu(self.fc1(x)) x self.drop1(x) return self.fc2(x)这个网络的核心逻辑是第一层卷积把 1 通道灰度图扩展成 32 个特征图第二层卷积再扩展成 64 个每次卷积后接 BatchNorm 统一分布再经过 2×2 最大池化把尺寸从 28×28 降到 14×14再降到 7×7。view把 64 个 7×7 特征图拉成一维向量长度 64×7×73136交给后面的全连接层。输出层 10 个神经元对应 0 到 9取值最大的那个就是预测数字。这里有两个参数值得单独说。第一padding1让卷积后特征图尺寸不变如果没有 padding28×28 会变成 26×26后面的全连接层输入维度要跟着全改新手最容易在维度对不上时反复报错。第二Dropout 只接在全连接层比例 0.25这是为了压制过拟合卷积层的正则化主要由 BatchNorm 承担不需要额外加。3.2 关键超参batch size、学习率、epoch 的一组稳定取值MNIST 很小超参不需要追求极致重要的是理解边界。一组在 CPU 上也能稳定跑完、准确率能到 99% 的组合是batch size 128、学习率 0.001、epoch 10、优化器 Adam损失函数用交叉熵。batch size 128 是平衡点。64 更稳但更慢256 会让梯度估计更平滑但内存占用高128 在 CPU 和 GPU 上都跑得舒服。学习率 0.001 是 Adam 的默认节奏一般不要往上调0.01 容易出现 loss 早期震荡0.0001 会慢到 10 个 epoch 推不上 99%。epoch 10 对 MNIST 来说够了第 3 个 epoch 通常就能看到测试集准确率超过 98%后面几个 epoch 精度增长很慢靠的是 BatchNorm 和 Dropout 的稳定作用。损失函数用nn.CrossEntropyLoss()它内部自动把网络输出的 10 个数做 softmax 再算交叉熵所以forward里不需要手动加 softmax。3.3 训练主循环与评测用 10 个 epoch 把识别准确率推上 99%训练主循环写法各家差异很大但核心只有三步前向算 logits、算损失、反向传播。下面这份代码可以直接替换进源码的 main 部分import torch import torch.nn as nn import torch.optim as optim from torch.utils.data import DataLoader EPOCHS 10 BATCH_SIZE 128 LR 1e-3 train_loader DataLoader(train_data, batch_sizeBATCH_SIZE, shuffleTrue, num_workers0) test_loader DataLoader(test_data, batch_sizeBATCH_SIZE, shuffleFalse, num_workers0) model Net() criterion nn.CrossEntropyLoss() optimizer optim.Adam(model.parameters(), lrLR) for epoch in range(EPOCHS): model.train() total_loss 0.0 for images, labels in train_loader: optimizer.zero_grad() outputs model(images) loss criterion(outputs, labels) loss.backward() optimizer.step() total_loss loss.item() print(fepoch {epoch1:02d} loss {total_loss / len(train_loader):.4f}) model.eval() correct 0 total 0 with torch.no_grad(): for images, labels in test_loader: _, predicted torch.max(model(images), 1) total labels.size(0) correct (predicted labels).sum().item() print(ftest acc {correct / total:.4f})先说逻辑。optimizer.zero_grad()必须写在每个 batch 的前面否则梯度会跨 batch 累加loss 曲线会变得难以收敛。model.train()和model.eval()分别开启和关闭 Dropout 与 BatchNorm 的训练行为很多人漏掉model.eval()导致测试准确率偏低且每次结果浮动。torch.no_grad()让测试阶段不计算梯度省内存也避免误更新参数块里的torch.max(model(images), 1)取的是每个样本 10 个输出中最大值的下标这个下标就是预测类别。参数怎么跟着效果调如果第 1 个 epoch 后 loss 还在 0.5 以上说明学习率太大或网络初始化不稳可以降到 0.0003 重跑。如果第 10 个 epoch 测试准确率只有 98.5% 上下浮动不要急着加 epoch先像第 4.2 节那样检查是不是网络结构少了 BatchNorm。跑完这段代码控制台最后一行应该能打印出 0.99 以上的测试准确率这时才可以说这份源码在本地真正跑通了。4. 避坑MNIST 训练里反复踩的 5 个翻车点即使照着上面的代码写新手也大概率会遇到下面这些问题。每一条都按“现象 → 原因 → 解决”来写这些是我在多个环境里真实撞过的坑写出来省得你再踩一遍。4.1 下载报 404卡在 URL not found 时手动放置四个 gz 文件现象第一次运行datasets.MNIST(downloadTrue)控制台打出Downloading http://…接着报URL not found或Connection errordata/MNIST/raw目录里只有一个空文件或者什么都没有。原因torchvision 内置的下载地址指向 MNIST 官方数据源这个域名和路径历史上变动过另外部分网络环境访问外部资源不稳定也会卡在下载阶段。这不是代码的问题也不是 torch 装坏了是数据源访问不到。解决按 2.2 节的做法把download设为 False手动下载四个.gz文件放进data/MNIST/raw。放好后重新运行加载代码torchvision 会识别已有文件不会再尝试下载。一个通用检查是看文件大小train-images-idx3-ubyte.gz解压前大约 9.9 MB如果下载下来只有几百字节说明拿到的是错误页或空文件删掉重新下不要硬着头皮继续训练否则会报“unexpected end of data”这类解压错误。4.2 准确率卡在 98% 上不去先检查网络结构而不是加 epoch现象loss 已经降得很低训练集准确率接近 100%但测试集准确率始终在 98%98.5% 之间波动加到 20 个 epoch 也过不去。原因网络结构本身表达能力不够或者缺少归一化层。只用一个卷积层再接全连接模型能识别大部分工整数字但测试集里总有倾斜、断笔、带噪声的样本其中 4 和 9、7 和 1 这类形状相近的数字尤其容易被搞混。解决把模型换成 3.1 节带两个卷积层 BatchNorm 的结构只做这一处改动测试准确率通常能跨过 99%。如果还差一点把第一层通道从 32 提到 64、第二层从 64 提到 128准确率会继续小幅上涨但训练时间也翻倍。对 MNIST 来说 32/64 已经足够不需要再往上堆。记住加 epoch 不会解决结构问题只是延长等待时间。4.3 验证 loss 反升模型在记住训练集现象训练 loss 一路下降但每轮测试的准确率在后期不升反降或者测试 loss 在第 7 个 epoch 后反弹打印的预测结果对训练集几乎全对。原因过拟合。MNIST 虽然只有 6 万张图但 28×28 的输入对全连接层较多的网络来说参数偏多模型开始记住训练样本的噪声而不是学习数字的一般规律。常见诱因是 Dropout 忘记加或者训练集没有做数据增强。解决在全连接层后加nn.Dropout(0.25)并确保测试循环里写了model.eval()让 Dropout 只在训练时生效。如果还想再压一压过拟合可以在 transform 中加入随机旋转和平移transform transforms.Compose([ transforms.RandomRotation(5), transforms.RandomAffine(0, translate(0.02, 0.02)), transforms.ToTensor(), transforms.Normalize((0.1307,), (0.3081,)) ])这段 transform 里的旋转和平移幅度都很克制数字的语义不会因为旋转 5 度而改变却能显著增加训练样本的多样性让模型不再死记原始像素。加了增强之后训练 loss 会比之前高一点这是正常现象不要因为训练集准确率下降就撤掉增强。4.4 训练中途 OOM先减 batch 而不是换机子现象前几个 epoch 正常第 4 个或第 5 个 epoch 跑着跑着中断提示RuntimeError: CUDA out of memory或者笔记本风扇狂转后进程被系统杀掉。原因最常见的是DataLoader的num_workers在 Windows 下开太多另一种是代码里只写了images images.cuda()没写model model.cuda()模型留在 CPU、数据在 GPU反而把内存占用抬上去了。解决num_workers0最稳batch size 从 128 减到 64内存占用直接砍半。如果确认要跑 GPU就把model.cuda()和数据images.cuda()同时写上或者统一用torch.device(cuda)接管MNIST 这种规模CPU 完全能跑完不要为了提速硬开 GPU 反而被显存限制困住。4.5 CPU 太慢先用小 epoch 验证方向再全量跑现象单核 CPU 跑一个 epoch 要三五分钟10 个 epoch 下来二十多分钟改一个参数又要重来一遍训练体验非常劝退。原因不是电脑慢是网络和配置偏大。卷积操作要对几千张图逐像素计算CPU 默认可能只用了单线程torch没有自动把所有核都用起来。解决在脚本开头加一行torch.set_num_threads(4)强制用多核另外把 batch size 降到 64、epoch 先设成 5跑通验证结论后再加回来。还有一个实用技巧把测试准确率打印放在每个 epoch 后面不要留到最后这样中途就知道要不要继续等。先验证代码能跑通再全量训练能省下大量反复等待的时间。5. 换个场景把 MNIST 源码改造成仪表识别与农业病虫害识别MNIST 最重要的价值不是那张 99% 的成绩单而是它证明了“图像 → 类别”这条识别流程的通用性。标题里的源码如果只跑到 MNIST 就收工投入产出比太低常见做法是把它作为骨架迁移到仪表识别、农业病虫害识别、口腔疾病图像识别这些真实任务上。这一节讲迁移时改哪些文件、会遇到哪些新问题。5.1 为什么迁移能成立卷积层学到的是一般图像特征手写数字识别和仪表盘数字识别、仪表指针识别的本质都是分类任务输入一张图输出一个类别标签。MNIST 源码中的卷积层学习的是边缘、拐角、笔画这些低层特征这些特征在不同任务里是通用的真正要换的是数据加载部分、输出类别数量和训练数据规模。所以迁移时不要重写网络结构而是先替换数据集再调整最后那个输出层。5.2 替换数据集ImageFolder 与自定义 Dataset 的最小实现第一步把数据加载部分换成自己的数据集。两个选择如果数据是像 MNIST 一样的单通道灰度图并且按类别分文件夹用torchvision.datasets.ImageFolder最省事如果是一个大目录加一个 CSV 标注文件就自己写一个Dataset子类。第二步统计类别数量把Net最后的nn.Linear(128, 10)改成nn.Linear(128, num_classes)。第三步把DataLoader里的 batch size 调小真实图片通常是几百到几千像素显存占用比 MNIST 大得多从 32 开始试。自定义Dataset的最小骨架可以这样写import torch from torch.utils.data import Dataset from PIL import Image class MyDataset(Dataset): def __init__(self, image_paths, labels, transformNone): self.image_paths image_paths self.labels labels self.transform transform def __len__(self): return len(self.image_paths) def __getitem__(self, idx): img Image.open(self.image_paths[idx]).convert(L) label self.labels[idx] if self.transform: img self.transform(img) return img, torch.tensor(label)代码逻辑是__len__告诉 DataLoader 一共有多少样本__getitem__返回单张图和对应标签。convert(L)把图片转成灰度在仪表识别这类场景里特常用如果你的原始图片是彩色且颜色本身是区分依据就不要转灰度同时把网络第一层的输入通道从 1 改成 3。这是迁移时最容易漏的点改完类别数忘了改Conv2d的in_channels一跑就报维度不匹配。5.3 迁移后的训练参数先跑小验证集再上全量真实数据集不会像 MNIST 这么“乖”样本数量少、类别不平衡、背景混乱、标注噪声都可能出现。我的做法是先取每类 20 张构成一个小验证集把模型跑 50 个 epoch目标是看 loss 能不能降、有没有过拟合而不是一上来追求准确率。训练参数通常在 MNIST 的基础上做两个调整学习率降为 0.0005batch size 降到 32 或 16epoch 不再固定为 10而是用“连续 5 个 epoch 测试准确率不提升就提前停止”的早停策略。比如农业病虫害识别数据集里“健康叶片”和“病斑叶片”数量常常差一个量级直接用 MNIST 那套 128 batch 会让模型偏向大头类别。显式做法是在CrossEntropyLoss里传weight参数给少数类别更大的权重或者用WeightedRandomSampler对采样做重均衡。这两个都只改训练循环不改模型结构属于投入产出比很高的调整。5.4 真实场景与 MNIST 的三个差距背景、光照、小目标MNIST 每张图都只有黑底白字识别目标占据画面绝对主体。仪表识别里数字可能只占画面一小块旁边还有指针、表盘刻度、玻璃反光农业病虫害识别里病斑更小甚至只有几个像素。直接拿 MNIST 模型去跑真实数据基本会失败我一般会在迁移之前做三步预处理把目标区域裁剪出来、做灰度归一化、做数据增强旋转、翻转、亮度抖动。这三步做完同样的网络在真实数据上通常能涨 10 个百分点以上。还有一个容易被忽视的问题真实数据集的类别标签往往是文本比如“正常叶片”“锈病叶片”需要先用LabelEncoder转成 0 到 N-1 的整数再传给损失函数否则会报字符串无法计算梯度的错。这一步不算算法问题但很常见提前做了能省掉一次莫名其妙的报错。5.5 输出概率的意义低于置信度阈值就人工复检MNIST 里我们直接用argmax取最大值的下标作为预测这在 10 类、类别几乎均衡的数据集里没问题。但真实任务里如果模型对某个样本的最大输出只有 0.3说明它并没有把握这个样本大概率是需要人工复检的困难样本。我在做仪表识别时会把输出概率也打印出来设置一个置信度阈值比如 0.7低于阈值就不直接识读而是流转给人工确认。这是 MNIST 源码教会我的一个重要习惯分类结果不只是一个标签还要带一个置信度。6. 让准确率可信混淆矩阵、可视化与模型持久化训练结束只给了一行测试准确率这不够。最后补上验证与交付的三个动作看混淆矩阵、保存模型、写推理脚本。6.1 混淆矩阵谁和谁最容易搞混测试准确率 99% 意味着平均 100 个里有 1 个错但错在哪类很重要。常见做法是把测试集所有预测结果和真实标签收集起来用 sklearn 画一个 10×10 的混淆矩阵。如果发现 4 和 9 互相混淆占了错误的大半说明模型对这两个数字的弯钩形状区分不够可以针对性增加这类样本的旋转增强而不是盲目加深网络。MNIST 数据集小你可以用很少的计算量看清楚改进方向。from sklearn.metrics import confusion_matrix, classification_report preds [] trues [] model.eval() with torch.no_grad(): for images, labels in test_loader: _, predicted torch.max(model(images), 1) preds.extend(predicted.cpu().tolist()) trues.extend(labels.tolist()) print(classification_report(trues, preds)) print(confusion_matrix(trues, preds))这段代码把预测结果和真实标签分别收集成两个列表classification_report会打印每个数字的精确率、召回率和 F1confusion_matrix给出 10×10 矩阵行是真实类列是预测类。对角线上数字越大越好非对角线上的数字就是具体错误来源。6.2 模型保存与加载漏掉 eval 会出现的怪现象源码里只训练不保存权重是常见遗憾。加几行代码把模型存下来之后再识别单张图就不用重训torch.save(model.state_dict(), mnist_cnn.pt) demo_model Net() demo_model.load_state_dict(torch.load(mnist_cnn.pt, map_locationcpu)) demo_model.eval()加载后必须调用demo_model.eval()否则 Dropout 和 BatchNorm 仍处于训练模式同样的图片每次推理结果可能不一样。这是我吃过亏的地方模型在训练时准确率很高保存后再加载识别结果却乱跳检查了半天才发现是漏了这行。保存state_dict而不是整个模型是推荐做法这样换机器、换 Python 版本时只加载权重不依赖原对象的类路径。6.3 用测试集校准交付前必做的自检顺序我在 MNIST 上养成的习惯是每次改完参数只看测试集准确率不看训练集表现每次保存模型都要写一个只读测试集、不参与训练的独立推理脚本。这样交付出去的东西才不是黑匣子。把混淆矩阵、模型文件、准确率记录放在同一个目录项目就能随时回滚、对比。MNIST 很小所以它最适合做这种“先把流程跑顺再上真实数据”的预演。希望这一套从 MNIST 跑通到迁移验证的流程能帮你在自己的识别场景里少走几步弯路。本文还有配套的精品资源点击获取
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Cursor 启动不直接进入项目?TaoToken 配置文件骨架与验证动作 2026/9/28 18:24:52

Cursor 启动不直接进入项目?TaoToken 配置文件骨架与验证动作

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
当大模型学会“偷懒”:从 DeepSeek MoE 稀疏激活到 KV Cache 的配置验证 2026/9/28 18:24:52

当大模型学会“偷懒”:从 DeepSeek MoE 稀疏激活到 KV Cache 的配置验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
离线安装 VSCode 插件:用 TaoToken 统一 Key 打通内网 AI 编码链路 2026/9/28 18:24:51

离线安装 VSCode 插件:用 TaoToken 统一 Key 打通内网 AI 编码链路

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
智谱 Z Code 配置 TaoToken:Claude Code、Codex、Gemini 统一 Key 接入指南 2026/9/28 18:24:51

智谱 Z Code 配置 TaoToken:Claude Code、Codex、Gemini 统一 Key 接入指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
AI编程助手深度对比:Cursor/Windsurf/Trae/Cline/Continue五大工具全维度评测与TaoToken统一接入实践 2026/9/28 18:24:51

AI编程助手深度对比:Cursor/Windsurf/Trae/Cline/Continue五大工具全维度评测与TaoToken统一接入实践

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
Python基于LDA主题模型的电商评论情感分析实战 2026/9/28 18:24:44

Python基于LDA主题模型的电商评论情感分析实战

简介:这份资源面向Python数据分析与文本挖掘的学习者,尤其是需要完成课程设计或电商评论分析项目的学生与开发者。它围绕LDA主题模型展开,完整覆盖从爬虫源数据预处理、评论特征名词提取,到情感副词与情感词加权打分、构建特征名词…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉