ResNet18在CIFAR-10上的实战:从训练到95%准确率
简介这份资源面向深度学习入门与进阶学习者聚焦图像识别方向提供在CIFAR10数据集上训练ResNet18模型的完整工程。ResNet18通过残差短路结构缓解深层网络的梯度消失问题配合PyTorch框架可清晰实践模型定义、数据预处理与训练优化全流程。压缩包共26个文件约341.16MB包含3个Python脚本用于模型与训练逻辑、1个pt权重文件、CIFAR10的data_batch与test_batch数据分片、若干jpg预测效果图及字体等辅助文件目录结构便于按模块查阅。已有1384人学习下载适合希望理解残差网络原理、复现训练过程或直接加载权重进行预测的读者可从中掌握数据增强、交叉熵损失、学习率调度与模型保存加载等关键环节对夯实深度学习实践能力具有较高参考价值。1. 从 ResNet18_CIFAR10.rar 说起一个压缩包背后到底藏着什么很多人第一次看到ResNet18_CIFAR10.rar这个文件名第一反应是「这不就是个作业压缩包吗」。但如果你正在找它大概率不是想交作业而是想搞清楚一件事怎么用 ResNet18 在 CIFAR-10 上跑出一个能看的准确率并且把训练、验证、推理这条链路完整走通。这个压缩包通常包含的是数据集加载脚本、模型定义、训练入口、配置文件可能还有预训练权重和日志。它解决的核心问题是给你一个可复现的最小工程骨架让你不用从零搭训练框架直接改参数就能跑。适合谁三类人一是刚学完卷积网络、想找一个标准数据集练手的学生二是需要快速验证某个改进点比如换损失函数、加注意力模块的算法工程师三是想把 CIFAR-10 当作教学案例的讲师。CIFAR-10 只有 60000 张 32×32 的彩色图10 个类别单卡几十分钟就能跑完一轮是验证想法性价比最高的数据集之一。ResNet18 则是残差网络里最轻的一档参数量约 1100 万既能体现残差连接的价值又不会让你等太久。这两者组合几乎是深度学习入门到进阶的必经之路。2. ResNet18 与 CIFAR-10 的匹配逻辑为什么不是 ResNet50 也不是 VGG2.1 残差连接在 32×32 小图上的真实收益ResNet 的核心是残差块输出等于输入加上经过两层卷积后的残差。公式上写y F(x) x但落到 CIFAR-10 这种小图上收益点跟 ImageNet 上不太一样。ImageNet 上残差主要解决深层网络梯度消失而 CIFAR-10 上 ResNet18 只有 18 层梯度消失本来就不严重。真正起作用的是两点一是残差块让浅层特征可以直通到深层小图本身空间信息少这种直通能保留更多边缘和纹理细节二是 CIFAR-10 的 32×32 分辨率下下采样次数不能太多ResNet18 在 CIFAR 版本里通常把第一层 7×7 卷积换成 3×3并且去掉 maxpool这样特征图在进入残差阶段前保持 32×32避免过早丢失空间信息。如果你直接拿 torchvision 里 ImageNet 版的 ResNet18 来跑 CIFAR-10第一层 7×7 步长 2 加 maxpool 会把 32×32 直接压到 8×8后面再下采样三次最后只剩 1×1空间信息几乎丢光准确率会卡在 70% 出头。所以常见做法是改第一层为 3×3 步长 1去掉 maxpool这样初始特征图保持 32×32经过四个 stage 后变成 4×4再全局池化信息保留合理。2.2 把 ResNet18 改成 CIFAR 版三个必须改的地方下面是一个最小可用的 CIFAR 版 ResNet18 定义基于 PyTorch只保留关键结构方便你直接抄。import torch import torch.nn as nn import torch.nn.functional as F class BasicBlock(nn.Module): expansion 1 def __init__(self, in_planes, planes, stride1): super(BasicBlock, self).__init__() # 3x3 卷积padding1 保持空间尺寸 self.conv1 nn.Conv2d(in_planes, planes, kernel_size3, stridestride, padding1, biasFalse) self.bn1 nn.BatchNorm2d(planes) self.conv2 nn.Conv2d(planes, planes, kernel_size3, stride1, padding1, biasFalse) self.bn2 nn.BatchNorm2d(planes) self.shortcut nn.Sequential() # 如果输入输出通道不一致或需要下采样用 1x1 卷积调整 if stride ! 1 or in_planes ! self.expansion * planes: self.shortcut nn.Sequential( nn.Conv2d(in_planes, self.expansion * planes, kernel_size1, stridestride, biasFalse), nn.BatchNorm2d(self.expansion * planes) ) def forward(self, x): out F.relu(self.bn1(self.conv1(x))) out self.bn2(self.conv2(out)) out self.shortcut(x) # 残差相加 out F.relu(out) return out class ResNet18CIFAR(nn.Module): def __init__(self, num_classes10): super(ResNet18CIFAR, self).__init__() self.in_planes 64 # CIFAR 版第一层 3x3 卷积步长 1不接 maxpool self.conv1 nn.Conv2d(3, 64, kernel_size3, stride1, padding1, biasFalse) self.bn1 nn.BatchNorm2d(64) # 四个 stage每个 stage 两个 BasicBlock self.layer1 self._make_layer(BasicBlock, 64, 2, stride1) self.layer2 self._make_layer(BasicBlock, 128, 2, stride2) self.layer3 self._make_layer(BasicBlock, 256, 2, stride2) self.layer4 self._make_layer(BasicBlock, 512, 2, stride2) self.linear nn.Linear(512 * BasicBlock.expansion, num_classes) def _make_layer(self, block, planes, num_blocks, stride): strides [stride] [1] * (num_blocks - 1) layers [] for s in strides: layers.append(block(self.in_planes, planes, s)) self.in_planes planes * block.expansion return nn.Sequential(*layers) def forward(self, x): out F.relu(self.bn1(self.conv1(x))) out self.layer1(out) out self.layer2(out) out self.layer3(out) out self.layer4(out) out F.avg_pool2d(out, 4) # 32x32 经过四次下采样变成 4x4 out out.view(out.size(0), -1) out self.linear(out) return out逻辑说明BasicBlock里两个 3×3 卷积第二个卷积后不接 ReLU先跟 shortcut 相加再激活这是 ResNet 原始设计。shortcut在通道数变化或步长不为 1 时用 1×1 卷积加 BN 调整。ResNet18CIFAR第一层是 3×3 步长 1没有 maxpool四个 stage 的通道数分别是 64、128、256、512每个 stage 两个 block总共 12×2×417 层卷积加一个全连接符合 ResNet18 的层数定义。参数说明num_classes10对应 CIFAR-10 的十个类别。stride2出现在 layer2、layer3、layer4 的第一个 block负责下采样。avg_pool2d(out, 4)里的 4 是因为输入 32×32 经过三次步长 2 下采样变成 4×4如果输入尺寸变了这里要跟着改。biasFalse是因为后面接了 BN卷积偏置会被 BN 的偏移吸收省掉能减少参数量。2.3 数据加载与归一化参数别小看那几个小数CIFAR-10 的均值和标准差是固定的用错会明显掉点。常见做法是mean(0.4914, 0.4822, 0.4465)std(0.2023, 0.1994, 0.2010)。如果你用 0.5 和 0.5 这种通用值准确率大概会低 1 到 2 个百分点。数据增强方面训练集用随机裁剪加水平翻转就够了CIFAR-10 图片小过度增强反而有害。import torchvision import torchvision.transforms as transforms transform_train transforms.Compose([ transforms.RandomCrop(32, padding4), # 先 padding 再随机裁剪 transforms.RandomHorizontalFlip(), transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) transform_test transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)), ]) trainset torchvision.datasets.CIFAR10(root./data, trainTrue, downloadTrue, transformtransform_train) trainloader torch.utils.data.DataLoader(trainset, batch_size128, shuffleTrue, num_workers4) testset torchvision.datasets.CIFAR10(root./data, trainFalse, downloadTrue, transformtransform_test) testloader torch.utils.data.DataLoader(testset, batch_size100, shuffleFalse, num_workers4)逻辑说明RandomCrop(32, padding4)先把 32×32 图 padding 到 40×40再随机裁回 32×32相当于让物体位置有轻微偏移。RandomHorizontalFlip对 CIFAR-10 里的飞机、汽车、动物都合理但如果你做的是文字方向敏感的任务就不能用。Normalize的四个参数按通道顺序 R、G、B 对应。参数说明batch_size128是单卡 8GB 显存下的稳妥值再大可能 OOM再小训练会慢。num_workers4取决于你的 CPU 核数设成 0 会在主进程加载数据训练时 GPU 利用率上不去。downloadTrue只在第一次运行时下载后面会直接读本地。3. 训练脚本怎么写从优化器到学习率调度3.1 优化器与超参SGD 还是 AdamCIFAR-10 上 ResNet18 的经典配置是 SGD 加 momentum学习率 0.1weight decay 5e-4momentum 0.9。Adam 也能用但通常需要更小的学习率和更长的训练轮数最终准确率不一定比 SGD 高。如果你只是想快速看结果Adam 配 1e-3 学习率跑 50 轮也能到 90% 左右如果要冲 94% 以上还是老老实实用 SGD 加 cosine 退火。import torch.optim as optim from torch.optim.lr_scheduler import CosineAnnealingLR device torch.device(cuda if torch.cuda.is_available() else cpu) model ResNet18CIFAR(num_classes10).to(device) criterion nn.CrossEntropyLoss() optimizer optim.SGD(model.parameters(), lr0.1, momentum0.9, weight_decay5e-4) scheduler CosineAnnealingLR(optimizer, T_max200) # 200 轮周期逻辑说明CrossEntropyLoss内部已经包含 softmax所以模型最后一层不要加 softmax。CosineAnnealingLR让学习率从 0.1 按余弦曲线降到接近 0比阶梯下降更平滑后期收敛更稳。参数说明lr0.1是 SGD 在 CIFAR-10 上的常用起点如果你把 batch size 改成 256学习率可以线性放大到 0.2。weight_decay5e-4是 L2 正则系数太大欠拟合太小过拟合。T_max200表示 200 轮完成一个余弦周期如果你只跑 100 轮就改成 100。3.2 训练循环与验证每个 epoch 该看什么训练循环本身不复杂但有几个细节容易翻车一是记得在验证时切model.eval()并关掉梯度二是每个 epoch 结束后要调scheduler.step()三是最好记录训练损失和验证准确率方便判断是否过拟合。def train(epoch): model.train() train_loss 0 correct 0 total 0 for batch_idx, (inputs, targets) in enumerate(trainloader): inputs, targets inputs.to(device), targets.to(device) optimizer.zero_grad() outputs model(inputs) loss criterion(outputs, targets) loss.backward() optimizer.step() train_loss loss.item() _, predicted outputs.max(1) total targets.size(0) correct predicted.eq(targets).sum().item() print(fEpoch {epoch}: Loss {train_loss/(batch_idx1):.3f}, fAcc {100.*correct/total:.2f}%) def test(epoch): model.eval() correct 0 total 0 with torch.no_grad(): for inputs, targets in testloader: inputs, targets inputs.to(device), targets.to(device) outputs model(inputs) _, predicted outputs.max(1) total targets.size(0) correct predicted.eq(targets).sum().item() acc 100. * correct / total print(fTest Acc: {acc:.2f}%) return acc for epoch in range(1, 201): train(epoch) test(epoch) scheduler.step()逻辑说明optimizer.zero_grad()必须在loss.backward()之前否则梯度会累加。model.eval()会关闭 BN 的批量统计和 dropout验证时必须切。torch.no_grad()省显存也加速验证阶段不需要反向传播。参数说明outputs.max(1)返回每个样本最大 logit 的索引就是预测类别。predicted.eq(targets).sum().item()统计预测正确的数量。scheduler.step()放在 epoch 末尾如果放在 batch 里会变成每步都调学习率降太快。3.3 保存与加载别只存 state_dict保存模型时只存state_dict()是最省空间的但加载时必须先有模型结构定义。如果你想把结构也带上可以用torch.save(model, path)但这样加载依赖原始类定义换环境容易出问题。常见做法是存 state_dict 加一个配置字典。# 保存 torch.save({ epoch: epoch, model_state_dict: model.state_dict(), optimizer_state_dict: optimizer.state_dict(), acc: acc, }, resnet18_cifar10.pth) # 加载 checkpoint torch.load(resnet18_cifar10.pth, map_locationdevice) model.load_state_dict(checkpoint[model_state_dict]) optimizer.load_state_dict(checkpoint[optimizer_state_dict])逻辑说明把 epoch、optimizer 状态和准确率一起存方便断点续训。map_locationdevice在 CPU 上加载 GPU 保存的权重时必加否则会报错。参数说明resnet18_cifar10.pth是文件名你可以按实验编号命名比如resnet18_cifar10_sgd_cosine.pth避免覆盖。acc是验证准确率用来快速筛选最好的 checkpoint。4. 避坑与排查那些让准确率卡在 85% 的细节4.1 现象训练准确率涨但验证准确率不涨原因通常是数据增强太强或者 BN 在验证时没切 eval。CIFAR-10 图片只有 32×32如果你加了旋转、颜色抖动、Cutout 叠加训练集分布和测试集差异变大模型学到的特征泛化不过来。另一个常见原因是验证时忘了model.eval()BN 继续用 batch 统计而验证 batch 只有 100 张统计量波动大。解决先去掉所有增强只留归一化跑一轮看验证准确率是否正常。如果正常再逐个加回增强每次只加一种。验证前确认model.eval()和torch.no_grad()都写了。4.2 现象loss 变成 nan原因多半是学习率太大或者梯度爆炸。SGD 配 0.1 在 ResNet18 上一般不会炸但如果你把第一层改成 7×7 步长 2 又没加 BN或者用了自定义损失函数没做数值稳定就可能出 nan。另外CIFAR-10 标签是 0 到 9 的整数如果你不小心把标签做成了 one-hot 又用 CrossEntropyLoss也会报错或出 nan。解决先把学习率降到 0.01 跑几步看 loss 是否正常。检查模型第一层卷积后是否有 BN。确认标签是torch.long类型且范围在 0 到 9。如果用了混合精度初期可以先用 FP32 排除数值问题。4.3 现象GPU 利用率低训练速度慢原因通常是数据加载成了瓶颈。num_workers0时数据在主进程加载GPU 算完一个 batch 要等 CPU 读下一批。另外如果你把数据集放在机械硬盘上随机读取 60000 张小图也会慢。解决把num_workers设成 CPU 核数的一半到全部比如 8 核设 4 或 8。加pin_memoryTrue让数据从 CPU 到 GPU 的拷贝更快。如果内存够可以把整个数据集先读到内存里或者用 SSD 存数据。4.4 现象最终准确率只有 88% 到 90%上不去原因可能是训练轮数不够、学习率调度不对、或者模型结构有细微错误。ResNet18 在 CIFAR-10 上正常能到 93% 到 95%如果卡在 90% 以下先检查第一层是不是 3×3 步长 1、有没有 maxpool。另一个常见错误是 shortcut 的 stride 和主分支不一致导致相加时尺寸对不上PyTorch 会报错但如果你用了自动广播可能悄悄算错。解决打印每个 stage 的输出尺寸确认是 32、16、8、4。检查_make_layer里self.in_planes的更新逻辑确保每个 block 的输入通道数正确。把训练轮数加到 200用 cosine 退火通常能再涨 2 到 3 个点。4.5 现象加载预训练权重后准确率反而下降原因通常是预训练权重来自 ImageNet第一层是 7×7 卷积而你改成了 3×3形状不匹配。如果你强行加载PyTorch 会跳过不匹配的层但可能连 BN 的 running stats 也一起跳过了导致初期训练不稳定。解决加载时用strictFalse并且打印哪些层被跳过。对于第一层要么保持 7×7 但改步长和 padding 适配 32×32要么就从头训练。CIFAR-10 上从头训练 200 轮的成本并不高预训练权重带来的收益有限。5. 进阶技巧把 ResNet18 在 CIFAR-10 上推到 95%如果你已经跑通基础版想再往上走有几个经过验证的方向。第一个是标签平滑把硬标签换成 0.1 的平滑标签能减少过拟合通常涨 0.5 到 1 个点。第二个是 Cutout在训练图上随机挖一个 8×8 的方块置零模拟遮挡配合标签平滑能到 95% 左右。第三个是混合精度训练用torch.cuda.amp把显存占用降下来batch size 可以开到 256 甚至 512训练速度提升明显但要注意 loss scaling 防止梯度下溢。下面是一个带标签平滑和 Cutout 的训练片段你可以直接替换前面的对应部分。class LabelSmoothingCrossEntropy(nn.Module): def __init__(self, smoothing0.1): super().__init__() self.smoothing smoothing def forward(self, pred, target): log_probs F.log_softmax(pred, dim-1) nll_loss -log_probs.gather(dim-1, indextarget.unsqueeze(1)) nll_loss nll_loss.squeeze(1) smooth_loss -log_probs.mean(dim-1) loss (1 - self.smoothing) * nll_loss self.smoothing * smooth_loss return loss.mean() def cutout(img, size8): h, w img.size(1), img.size(2) y torch.randint(h, (1,)) x torch.randint(w, (1,)) y1 torch.clamp(y - size // 2, 0, h) y2 torch.clamp(y size // 2, 0, h) x1 torch.clamp(x - size // 2, 0, w) x2 torch.clamp(x size // 2, 0, w) img[:, y1:y2, x1:x2] 0 return img criterion LabelSmoothingCrossEntropy(smoothing0.1)逻辑说明LabelSmoothingCrossEntropy把真实类别的概率从 1 降到 0.9其余 0.1 均匀分给其他类别防止模型对训练标签过度自信。cutout在每张图上随机选一个中心点挖掉 8×8 的区域模拟遮挡强迫模型学习更鲁棒的特征。参数说明smoothing0.1是常用值太大欠拟合太小没效果。size8对 32×32 的图来说约等于挖掉 6% 的面积再大可能丢关键信息。Cutout 只在训练时用验证和测试时不要加。还有一个容易被忽略的点是权重衰减和 BN 的配合。BN 的 weight 和 bias 通常不参与 weight decay如果你用统一的 optimizer 参数BN 的 weight 也会被衰减长期训练可能让 BN 失效。常见做法是把 BN 参数单独分组不设 weight decay。bn_params [] other_params [] for name, param in model.named_parameters(): if bn in name or bias in name: bn_params.append(param) else: other_params.append(param) optimizer optim.SGD([ {params: other_params, weight_decay: 5e-4}, {params: bn_params, weight_decay: 0}, ], lr0.1, momentum0.9)逻辑说明把 BN 的 weight、bias 和所有层的 bias 归到一组weight decay 设为 0其余卷积权重保持 5e-4。这样 BN 的缩放和平移参数不会被正则化拉向零训练更稳定。参数说明bn in name匹配所有 BatchNorm 层的参数bias in name匹配卷积和全连接的偏置。如果你的模型里有其他需要排除的参数可以继续加条件。最后说一个我自己的习惯每次改完结构或超参先跑 5 个 epoch 看 loss 下降趋势如果 5 轮内 loss 没降到 2.0 以下大概率是学习率或初始化有问题不用等 200 轮。这个习惯帮我省过很多次通宵。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

@zag-js/svelte 适配层全解析:从 0.34 到 1.45 的 Svelte 状态机集成演进

@zag-js/svelte 适配层全解析:从 0.34 到 1.45 的 Svelte 状态机集成演进

前端UI组件 【免费下载链接】zag Build your design system in React, Solid, Vue, Svelte or Vanilla. Powered by finite state machines 项目地址: https://gitcode.com/gh_mirrors/za/zag 点击查看 免费下载 zag-js/svelte 是 zag 项目为 Svelte 框架提供的官方…

2026/10/13 8:29:41 阅读更多 →
Pyarmor 8 与 9 路线图全解:从 Release Plan 逐版本读懂功能演进与源码实现

Pyarmor 8 与 9 路线图全解:从 Release Plan 逐版本读懂功能演进与源码实现

开发工具应用安全 【免费下载链接】pyarmor A tool used to obfuscate python scripts, bind obfuscated scripts to fixed machine or expire obfuscated scripts. 项目地址: https://gitcode.com/gh_mirrors/py/pyarmor 点击查看 免费下载 本文基于仓库中的 docs…

2026/10/13 8:29:41 阅读更多 →
Keras多输入数据流水线搭建:从ImageDataGenerator到tf.data实战

Keras多输入数据流水线搭建:从ImageDataGenerator到tf.data实战

1. 为什么必须吃透Keras的generator——不是写代码,是搭数据流水线“Keras实例:generator生成器(多输入/ImageDataGenerator)”这个标题看着像教程目录里的一行小字,但在我带过的十几个模型训练项目里,它几…

2026/10/13 8:28:41 阅读更多 →

最新新闻

文华软件期货指标公式大全富途牛牛

文华软件期货指标公式大全富途牛牛

HH1:(EMA(CLOSE,12) - EMA(CLOSE,26))*100; LL1:EMA(HH1,9); DRAWTEXT(CROSS(HH1,LL1),90,众),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),90,4),COLORYELLOW; DRAWTEXT(CROSS(HH1,LL1),60,龙),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),60,8),COLORYELLOW; DRAWTEXT(CROSS(HH1,LL1),70,…

2026/10/14 11:06:16 阅读更多 →
一台一只手就能托起的四足机器人,凭什么拿到 4.6k 星?

一台一只手就能托起的四足机器人,凭什么拿到 4.6k 星?

Sesame 开源项目深度拆解:从硬件、固件到动画工具、仿真与强化学习生态以及边界 项目作者:Dorian Todd(doriantodd.com/sesame) 仓库数据获取时间:2026-10-12 00:36(北京时间) 开篇:…

2026/10/14 11:06:16 阅读更多 →
通达信期权指标文华软件指标公式

通达信期权指标文华软件指标公式

HH1:(EMA(CLOSE,12) - EMA(CLOSE,26))*100; LL1:EMA(HH1,9); DRAWTEXT(CROSS(HH1,LL1),90,众),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),90,4),COLORCYAN; DRAWTEXT(CROSS(HH1,LL1),60,龙),COLORWHITE; DRAWTEXT(CROSS(LL1,HH1),60,8),COLORCYAN; DRAWTEXT(CROSS(HH1,LL1),70,育),…

2026/10/14 11:06:16 阅读更多 →
Django实战:用GitHub API构建用户展示网站

Django实战:用GitHub API构建用户展示网站

1. 项目概述:为什么一个 GitHub 用户展示网站值得从 Django 开始练手“Django 实战 | 搭一个 GitHub 用户展示网站 01”——这个标题乍看像教程合集里的普通一节,但背后藏着一条非常扎实的 Web 开发入门路径。我带过不少刚转行的开发者,也帮某…

2026/10/14 11:06:16 阅读更多 →
AI做PPT实战:对话改稿生成18页傅里叶课件

AI做PPT实战:对话改稿生成18页傅里叶课件

1. 从一份18页傅里叶课件说起:AI做PPT到底进化到了什么程度前阵子帮一位在高校做助教的朋友处理课件,他需要把一份关于傅里叶变换的讲义整理成18页左右的PPT,用于本科信号与系统课程的复习课。他原本的做法是:先在文档里写好内容&…

2026/10/14 11:06:16 阅读更多 →
第2章:Linux 基础,pwd 命令

第2章:Linux 基础,pwd 命令

专栏导航 上一篇:第2章:Linux 基础,date 命令 回到目录 下一篇:第2章:Linux 基础,whoami 命令 本节前言 对于本节所讲解的知识,有可能,你会需要时不时地参考本专栏的其它文章。真…

2026/10/14 11:05:15 阅读更多 →

日新闻

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/13 16:22:04 阅读更多 →
影刀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 阅读更多 →