PyTorch实战:CNN猫狗图像分类从数据管线到模型部署全流程
简介这份资源是面向计算机相关专业学生与深度学习入门者的猫狗图像分类实战项目基于Python卷积神经网络CNN实现可作为毕业设计、课程设计或期末大作业的参考方案难度适中适合需要完整项目练手的同学。压缩包共2000个文件约86.82MB其中1992个jpg为猫狗训练与测试图像7个py脚本负责数据读取、模型搭建、训练与预测另有1个md说明文档便于快速理解项目结构与运行方式。目前已有207人学习下载具备一定参考热度。项目源码经本地编译调试可正常运行并附完整数据集读者可据此掌握CNN卷积、池化、全连接等核心环节理解图像预处理、模型训练与分类评估的完整流程也能在此基础上调整网络结构或超参数完成自己的实验与论文写作省去从零搜集数据与搭建框架的时间。1. 猫狗分类这个入门题为什么成了很多人的翻车现场基于Python卷积神经网络CNN的猫狗图像分类几乎是每个想入门深度学习的人都会碰到的第一个项目。数据集规模不大、标签干净、任务定义清晰看起来是最适合练手的题目。但真正动手做过的人都知道这个项目里藏着一堆让人抓狂的细节训练集准确率冲到 0.98验证集却卡在 0.6 死活上不去换了三层卷积改成五层loss 直接变成 nan好不容易跑出一个能用的模型想拿一张自家猫的照片测一下结果预测结果离谱得让人怀疑人生。问题不在于 CNN 本身有多难而在于大多数人跳过了数据管线和训练策略这两块直接抄了一份网络结构就开始跑。这个项目真正要解决的问题是如何用一套可复现的流程从原始图片目录出发经过数据清洗、增强、模型搭建、训练调参最终得到一个在未见数据上表现稳定的二分类器。它适合已经会写 Python、了解 NumPy 基本操作、想系统走一遍深度学习落地流程的开发者。下面我会按实际做项目的顺序把每一步的选择理由、代码和参数都讲清楚。2. 数据管线先立住从原始图片到可训练张量的完整路径2.1 为什么数据划分不能随便 split很多人拿到猫狗图片目录后直接train_test_split按 8:2 切一刀就开跑。这种做法在图片来自同一批采集源时问题不大但如果你的数据是从不同渠道拼凑的——比如一部分来自公开数据集一部分是自己爬的——随机切分会导致训练集和验证集的分布不一致。更隐蔽的问题是如果同一只猫的多张照片分别落进了训练集和验证集验证集准确率会被严重高估。我一般会先检查文件名或目录结构里有没有可以标识来源或个体的信息。如果有按个体划分而不是按图片划分。如果没有至少保证随机种子固定并且在切分前把整个数据集打乱一次。import os import random import shutil def split_dataset(src_dir, dst_dir, split_ratio0.8, seed42): 按类别将图片划分为训练集和验证集 src_dir: 原始目录结构为 src_dir/猫/xxx.jpg, src_dir/狗/xxx.jpg dst_dir: 输出目录会生成 dst_dir/train/猫, dst_dir/val/猫 等 random.seed(seed) classes [d for d in os.listdir(src_dir) if os.path.isdir(os.path.join(src_dir, d))] for cls in classes: cls_dir os.path.join(src_dir, cls) images [f for f in os.listdir(cls_dir) if f.lower().endswith((.jpg, .jpeg, .png))] random.shuffle(images) split_idx int(len(images) * split_ratio) train_imgs images[:split_idx] val_imgs images[split_idx:] for subset, img_list in [(train, train_imgs), (val, val_imgs)]: out_dir os.path.join(dst_dir, subset, cls) os.makedirs(out_dir, exist_okTrue) for img in img_list: shutil.copy2(os.path.join(cls_dir, img), os.path.join(out_dir, img)) print(f{cls}: 训练集 {len(train_imgs)} 张, 验证集 {len(val_imgs)} 张) split_dataset(./raw_data, ./dataset, split_ratio0.8, seed42)这段代码的核心逻辑是按类别分别切分保证每个类别的训练/验证比例一致。seed42是为了让每次运行结果可复现这在调参阶段非常重要——否则你改了模型结构验证集变了根本分不清是模型变好了还是数据变简单了。split_ratio0.8是常见起点但如果你的数据总量少于 2000 张建议改成 0.7给验证集留出足够的统计意义。2.2 ImageFolder 与 DataLoader 的配合方式PyTorch 的ImageFolder要求目录结构严格按类别分文件夹这正好匹配上一步的输出。但直接用ImageFolder有个坑它默认按文件夹名的字母顺序分配标签猫和狗的标签顺序取决于拼音还是英文不同机器上可能不一致。我一般会显式打印class_to_idx确认一下。import torch from torchvision import datasets, transforms from torch.utils.data import DataLoader # 训练集增强策略 train_transform transforms.Compose([ transforms.Resize((256, 256)), # 先放大再裁剪保留更多信息 transforms.RandomResizedCrop(224), # 随机裁剪到 224增加尺度多样性 transforms.RandomHorizontalFlip(p0.5), # 水平翻转猫狗都适用 transforms.RandomRotation(15), # 小角度旋转模拟拍摄角度变化 transforms.ColorJitter(brightness0.2, contrast0.2, saturation0.2), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) # 验证集只做确定性变换 val_transform transforms.Compose([ transforms.Resize((256, 256)), transforms.CenterCrop(224), transforms.ToTensor(), transforms.Normalize(mean[0.485, 0.456, 0.406], std[0.229, 0.224, 0.225]) ]) train_dataset datasets.ImageFolder(./dataset/train, transformtrain_transform) val_dataset datasets.ImageFolder(./dataset/val, transformval_transform) print(类别映射:, train_dataset.class_to_idx) train_loader DataLoader(train_dataset, batch_size32, shuffleTrue, num_workers4, pin_memoryTrue) val_loader DataLoader(val_dataset, batch_size32, shuffleFalse, num_workers4, pin_memoryTrue)这里有几个参数值得展开说。RandomResizedCrop(224)和前面的Resize((256, 256))配合使用先统一放大到 256 再随机裁到 224比直接Resize((224, 224))效果更好因为随机裁剪引入了平移不变性。Normalize用的均值方差是 ImageNet 的统计值如果你从零训练而不是用预训练权重理论上应该用自己的数据集算一遍但实践中直接用 ImageNet 的值影响很小。num_workers4在 Windows 上如果报错改成 0 即可这是多进程加载在 Windows 上的已知限制。2.3 数据量不够时增强策略怎么调猫狗分类的公开数据集通常有两万多张但很多人手头只有几百到几千张。数据量少的时候增强策略要更激进但也不能乱加。我见过有人在猫狗分类里加RandomVerticalFlip结果模型把倒过来的猫也学成了猫验证集上正常图片反而识别率下降——因为自然场景里猫狗很少倒立出现。一个实用的判断标准是增强后的图片你自己还能不能一眼认出类别。如果翻转、旋转、颜色抖动之后你都得犹豫一下那这个增强就是在制造噪声。对于猫狗这个任务水平翻转、小角度旋转±15度以内、轻微颜色抖动是安全的垂直翻转、大角度旋转、随机擦除要谨慎使用。3. 模型选型从零搭 CNN 还是用预训练 backbone3.1 一个四层 CNN 的最小可用结构如果目的是学习 CNN 原理从零搭一个四层卷积网络是合理的起点。结构不用太复杂但要保证每一层的输出尺寸和通道数变化有清晰的逻辑。import torch.nn as nn class SimpleCNN(nn.Module): def __init__(self, num_classes2): super(SimpleCNN, self).__init__() self.features nn.Sequential( # 输入 3x224x224 nn.Conv2d(3, 32, kernel_size3, padding1), nn.BatchNorm2d(32), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # 32x112x112 nn.Conv2d(32, 64, kernel_size3, padding1), nn.BatchNorm2d(64), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # 64x56x56 nn.Conv2d(64, 128, kernel_size3, padding1), nn.BatchNorm2d(128), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # 128x28x28 nn.Conv2d(128, 256, kernel_size3, padding1), nn.BatchNorm2d(256), nn.ReLU(inplaceTrue), nn.MaxPool2d(2), # 256x14x14 ) self.classifier nn.Sequential( nn.AdaptiveAvgPool2d(1), # 256x1x1 nn.Flatten(), nn.Dropout(0.5), nn.Linear(256, num_classes) ) def forward(self, x): x self.features(x) x self.classifier(x) return x这个结构的关键设计点每个卷积块后面都跟了BatchNorm2d这在从零训练时能显著加快收敛AdaptiveAvgPool2d(1)替代了传统的view展平好处是不管输入尺寸怎么变输出都是固定维度避免了全连接层参数量爆炸Dropout(0.5)放在分类头前面是防止过拟合的第一道防线。3.2 预训练模型微调什么时候该用怎么用从零训练一个四层 CNN在两千张图上大概能跑到 85% 左右的验证准确率。但如果换成 ResNet18 预训练权重同样的数据量准确率通常能到 95% 以上。差距来自 ImageNet 上百万张图学到的底层特征——边缘、纹理、简单形状——这些特征对猫狗分类同样有效。import torchvision.models as models import torch.nn as nn def build_pretrained_model(num_classes2, freeze_backboneTrue): model models.resnet18(weightsmodels.ResNet18_Weights.IMAGENET1K_V1) if freeze_backbone: # 冻结除最后全连接层外的所有参数 for param in model.parameters(): param.requires_grad False # 替换分类头 in_features model.fc.in_features model.fc nn.Sequential( nn.Dropout(0.3), nn.Linear(in_features, num_classes) ) return model model build_pretrained_model(num_classes2, freeze_backboneTrue)freeze_backboneTrue适合数据量小于一千张的情况只训练最后的分类头训练速度快且不容易过拟合。如果数据量在两千张以上可以把freeze_backbone设为False但要用更小的学习率——通常比从头训练小一个数量级。我一般会分两阶段先冻结训练 5 个 epoch再解冻全部参数用 1e-4 的学习率微调 10 个 epoch。3.3 两种方案的对比与选择依据维度从零搭 CNN预训练微调数据需求至少 2000 张500 张即可起步训练时间较长需 50 epoch较短10-20 epoch最终准确率85%-90%95%学习价值理解卷积、池化、BN理解迁移学习过拟合风险高低冻结时选择逻辑很简单如果目标是交作业或快速出结果直接用预训练如果目标是搞懂 CNN 每一层在干什么从零搭一遍再对比预训练的效果收获更大。我自己的习惯是先用预训练跑一个 baseline确认数据管线没问题再换从零搭建的版本这样能把数据问题和模型问题分开排查。4. 训练循环里的关键参数与常见报错排查4.1 学习率、batch size 和优化器的组合逻辑训练不收敛十有八九是学习率的问题。Adam 的默认学习率 1e-3 在从零训练时经常太大loss 会震荡甚至发散而 SGD 用 1e-3 又太小收敛慢得让人想砸键盘。我一般从零训练时用 Adam 1e-4微调时用 SGD 1e-3 配合余弦退火。import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR def train_one_epoch(model, loader, criterion, optimizer, device): model.train() running_loss 0.0 correct 0 total 0 for images, labels in 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() * images.size(0) _, predicted outputs.max(1) correct predicted.eq(labels).sum().item() total labels.size(0) return running_loss / total, correct / total # 训练配置 device torch.device(cuda if torch.cuda.is_available() else cpu) model model.to(device) criterion nn.CrossEntropyLoss() optimizer optim.Adam(filter(lambda p: p.requires_grad, model.parameters()), lr1e-4) scheduler CosineAnnealingLR(optimizer, T_max30, eta_min1e-6) for epoch in range(30): train_loss, train_acc train_one_epoch(model, train_loader, criterion, optimizer, device) scheduler.step() print(fEpoch {epoch1}: loss{train_loss:.4f}, acc{train_acc:.4f})filter(lambda p: p.requires_grad, ...)这个写法是为了在冻结 backbone 时只更新分类头的参数避免优化器把冻结层的参数也纳入更新。CosineAnnealingLR的T_max设成总 epoch 数学习率会从初始值余弦下降到eta_min这个策略在微调时特别好用能避免后期学习率过大导致在最优解附近震荡。4.2 验证集准确率不涨的三种典型原因第一种是数据标签有问题。我遇到过文件夹名写错导致猫和狗的标签反了模型训练 loss 正常下降但验证准确率始终在 50% 附近。排查方法是打印一批验证集的图片和对应标签肉眼确认。第二种是 BatchNorm 在小 batch 下统计量不准。如果 batch size 小于 16BatchNorm 的 running mean 和 variance 会波动很大验证时表现不稳定。解决办法是增大 batch size或者改用 GroupNorm。第三种是过拟合。训练准确率 99%验证准确率 70%这是典型的过拟合信号。对策按优先级排序增加数据增强、加 Dropout、加权重衰减、减少模型参数量。不要一上来就加数据先确认增强策略是否已经用满。4.3 显存不够时的降级方案显存不够报CUDA out of memory时按以下顺序尝试先把 batch size 减半如果还不行把输入尺寸从 224 降到 128再不行就换更小的模型ResNet18 换 MobileNetV3最后才考虑用梯度累积模拟大 batch。# 梯度累积示例模拟 batch_size64 的效果实际每次只放 16 张 accumulation_steps 4 optimizer.zero_grad() for i, (images, labels) in enumerate(train_loader): images, labels images.to(device), labels.to(device) outputs model(images) loss criterion(outputs, labels) / accumulation_steps loss.backward() if (i 1) % accumulation_steps 0: optimizer.step() optimizer.zero_grad()注意 loss 要除以accumulation_steps否则梯度会放大对应倍数。这种写法在显存受限但想用大 batch 稳定训练时非常实用。5. 避坑指南五个让猫狗分类翻车的细节现象一训练 loss 正常下降验证准确率始终在 50%。原因通常是标签映射错了或者验证集的 transform 里混入了随机增强。解决方法是打印class_to_idx和验证集的前几张图确认标签和图像对应关系正确并检查验证集的 transform 是否只包含确定性操作。现象二第二个 epoch 开始 loss 变成 nan。原因多半是学习率太大导致梯度爆炸或者数据里有损坏的图片。先把学习率降到 1e-5 试一个 epoch如果还是 nan用 PIL 逐张打开图片检查是否有截断文件。另外检查Normalize的均值和方差是否写反了。现象三模型在验证集上表现很好但用手机拍的猫照片预测全错。这是域偏移问题。训练集的猫狗图片通常是正面、光照均匀的而手机拍的照片角度随意、背景复杂。解决办法是在训练增强里加入更多的随机裁剪和颜色抖动或者在推理前对输入图片做更严格的预处理——先检测并裁剪出主体区域再送入模型。现象四多进程加载数据时报 BrokenPipeError。这是num_workers设置过大或磁盘 I/O 瓶颈导致的。把num_workers降到 2 或 0如果问题消失就说明是资源竞争。长期方案是把数据集预处理好存成内存映射文件避免每次 epoch 都从磁盘读原始 JPEG。现象五换了随机种子后结果波动超过 5%。说明模型对初始化敏感训练不够稳定。对策是增加 epoch 数让模型充分收敛或者用交叉验证取平均。如果数据量小于一千张这种波动是正常的不要试图通过调参完全消除。6. 把模型用起来推理脚本与置信度阈值的一个实用技巧训练完模型只是走完了一半路真正要用起来还得写推理脚本。很多人直接把model.eval()一开图片一传就完事但实际部署时有两个细节值得注意。第一个是预处理必须和验证集完全一致。训练时用了Resize((256, 256))CenterCrop(224)推理时也要一模一样少一步或者顺序错了准确率就会掉。我一般会把验证集的 transform 单独存成一个变量推理脚本直接复用。from PIL import Image import torch import torch.nn.functional as F def predict(image_path, model, transform, class_names, device): model.eval() image Image.open(image_path).convert(RGB) tensor transform(image).unsqueeze(0).to(device) with torch.no_grad(): logits model(tensor) probs F.softmax(logits, dim1) confidence, pred_idx probs.max(1) return class_names[pred_idx.item()], confidence.item() # 使用示例 class_names [cat, dog] label, conf predict(./test.jpg, model, val_transform, class_names, device) print(f预测: {label}, 置信度: {conf:.4f})第二个技巧是关于置信度阈值的。二分类模型输出的 softmax 概率在 0.5 附近时实际可靠性很低。我一般会设一个阈值比如 0.7低于这个值的样本标记为不确定而不是强行给出猫或狗的结论。这在真实场景里比强行分类更有用——用户看到不确定会重新拍一张而不是得到一个错误答案。def predict_with_threshold(image_path, model, transform, class_names, device, threshold0.7): label, conf predict(image_path, model, transform, class_names, device) if conf threshold: return 不确定, conf return label, conf这个阈值怎么定拿验证集跑一遍画出置信度分布图看看正确预测的样本置信度集中在哪个区间错误预测的又在哪里。通常正确预测的置信度在 0.85 以上错误预测的在 0.6 以下阈值取中间偏保守的位置就行。我自己的习惯是宁可多报不确定也不要给用户一个高置信度的错误答案——后者对信任的伤害更大。最后说一个我踩过的坑模型训练完保存时一定要把class_to_idx一起存下来。我见过有人只存了state_dict换台机器加载时类别顺序反了猫被预测成狗排查了半天才发现是标签映射的问题。保存时用torch.save({model_state: model.state_dict(), class_to_idx: train_dataset.class_to_idx}, model.pth)加载时先恢复映射再推理这个习惯帮我省了很多后悔药。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

用CLIP打造本地图像搜索引擎:从特征提取到相似度检索完全指南

用CLIP打造本地图像搜索引擎:从特征提取到相似度检索完全指南

简介:这是一项基于OpenAI CLIP模型的本地化图像搜索引擎项目,面向熟悉Python的开发者,解决个人图片库中通过文本描述或上传图片快速查找相似图像的问题。包内共25个文件,压缩后仅2.8MB,涵盖8个Python脚本、配置依赖、M…

2026/10/11 9:40:09 阅读更多 →
Oracle 21c客户端配置实战:从静默安装到Wallet加密连接

Oracle 21c客户端配置实战:从静默安装到Wallet加密连接

简介:本资源为Oracle Database 21c官方客户端(21.3版本)Windows x64平台安装包,专为数据库开发、运维及DBA技术人员设计,用于连接和管理Oracle 21c及以上版本数据库实例,支持JDBC/ODBC调用、SQL*Plus工具使…

2026/10/11 9:40:14 阅读更多 →
函数的本质与五种实战表达形式:从工程思维重构代码

函数的本质与五种实战表达形式:从工程思维重构代码

1. 这不是数学课本里的定义,而是你每天都在用的“函数思维”函数这个词,一听到就容易让人想起中学黑板上那个写着 f(x) 2x 1 的粉笔字,还有老师强调的“每个输入对应唯一输出”。但说实话,我带过几十个零基础转行做数据分析、自…

2026/10/11 9:40:20 阅读更多 →

最新新闻

采矿CAD课程设计PPT:从软件操作到工程表达的全链路建模

采矿CAD课程设计PPT:从软件操作到工程表达的全链路建模

简介:本资源是一份面向高校采矿工程、地质环境与安全工程专业学生的《采矿CAD课程设计》教学课件,聚焦矿山地质环境治理与生态保护的CAD辅助设计实践。课件系统梳理了矿山地质环境定义、矿区生态破坏成因(含景观与生态双重破坏)、…

2026/10/12 0:54:26 阅读更多 →
桌面调度台 vs 云端 Agent 平台:Orca、美团 CatPaw、NVIDIA 路由器的三条路线谁先跑通

桌面调度台 vs 云端 Agent 平台:Orca、美团 CatPaw、NVIDIA 路由器的三条路线谁先跑通

桌面调度台 vs 云端 Agent 平台:Orca、美团 CatPaw、NVIDIA 路由器的三条路线谁先跑通 【免费下载链接】orca Orca is the ADE for working with a fleet of parallel agents. Run any coding agent with your own subscription. Available on desktop, mobile and …

2026/10/12 0:54:26 阅读更多 →
Kubernetes Python 客户端 V1beta2ResourceClaim 模型详解:Dynamic Resource Allocation 资源声明的完整 API 参考

Kubernetes Python 客户端 V1beta2ResourceClaim 模型详解:Dynamic Resource Allocation 资源声明的完整 API 参考

后端云原生容器编排 【免费下载链接】python Official Python client library for kubernetes 项目地址: https://gitcode.com/gh_mirrors/python1/python 点击查看 免费下载 导读 本文面向使用官方 Kubernetes Python 客户端(本项目仓库 gh_mirrors/p…

2026/10/12 0:54:26 阅读更多 →
CodeIgniter 4 Request 类详解:HTTP 请求的面向对象封装与全局数据安全访问

CodeIgniter 4 Request 类详解:HTTP 请求的面向对象封装与全局数据安全访问

后端Web框架 【免费下载链接】CodeIgniter4 Open Source PHP Framework (originally from EllisLab) 项目地址: https://gitcode.com/gh_mirrors/co/CodeIgniter4 点击查看 免费下载 本指南以 CodeIgniter 4 官方用户指南 request.rst 为主体,系统讲解框…

2026/10/12 0:54:26 阅读更多 →
Vibe Coding 的边界:从“70% 问题“到“80% 墙“,AI 编程五大局限性与人机分工深度解析

Vibe Coding 的边界:从“70% 问题“到“80% 墙“,AI 编程五大局限性与人机分工深度解析

文档教程Vibe Coding示例工程 【免费下载链接】vibe-vibe The First Systematic Vibe Coding Open-Source Tutorial | From Zero to Full-Stack, Empowering Everyone to Build Products with AI | Live at: www.vibevibe.cn ;首个系统化 Vibe Coding 开源教程 | 零…

2026/10/12 0:53:26 阅读更多 →
不用模拟器也能玩PS5游戏?拆解AnyPS5的“非模拟器魔法“:relinker重链接+PRX库+RDNA到SPIR-V

不用模拟器也能玩PS5游戏?拆解AnyPS5的“非模拟器魔法“:relinker重链接+PRX库+RDNA到SPIR-V

不用模拟器也能玩PS5游戏?拆解AnyPS5的"非模拟器魔法":relinker重链接PRX库RDNA到SPIR-V 【免费下载链接】AnyPS5 Tool for automatic PS5 executables porting to Linux and Windows 项目地址: https://gitcode.com/GitHub_Trending/an/Any…

2026/10/12 0:53:26 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/12 0:16:43 阅读更多 →

月新闻

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