ViT增量学习实战:LoRA与双层蒸馏实现87.58%准确率
去年做视觉分类项目的时候我碰上一个特别现实的需求系统刚跑通那边就提了五个新品类要加进去。新数据的标注还在陆陆续续补老数据又不能轻易下掉每次新增都全量重训光是训练时间就够喝一壶的了。当时第一反应就是走增量学习的路线——把新类学会同时别让老类被“洗掉”。后来我把这个方向做成了一套完整的Vision Transformer增量学习系统在CIFAR-100按“初始10类后续9轮增量各10类”的协议下最终平均准确率跑到87.58%代码和配置也顺手整理成了既能支撑毕业论文实验、又能放到企业里做POC落地的工程包。这篇文章不打算讲空泛的概念直接把我的技术选型、损失函数设计、调参过程、工程化改造和踩过的坑一次性说完。适合正在选毕设方向、或者需要在公司里做视觉模型持续迭代的读者参考也欢迎对增量学习本身感兴趣的朋友按这套路复现。1. 为什么非要用ViT来承载增量学习从“边训边出新类”的真实需求说起1.1 全量重训的代价数据、算力、时间三头堵大部分视觉分类项目的生命周期并不是“训练一次就结束”的。上线三个月后新的SKU、新的故障类型、新的场景标签会源源不断冒出来。这时候最常见的笨办法是把新旧数据合并从头训练一个模型然后重新评测、重新部署。如果数据量小还好说但一旦是百万级图片、批量级训练时长这种方式会迅速变得不可维护。更麻烦的是旧数据有时候已经不在本地了。出于存储成本、隐私策略或者数据生命周期管理方面的考虑企业里经常只保留特征、去重后的样本或者干脆只有标签统计真正要你提供原始图片做重训往往会被业务方婉拒。这时候增量学习的意义就出来了只给新类别的新数据模型自己要“抗遗忘”把老知识保留在参数和少量记忆中。增量学习面临的核心矛盾学术界叫灾难性遗忘catastrophic forgetting。神经网络在拟合新数据时梯度更新会覆盖掉对旧任务有用的参数模式。它有点像一个人同时学法语和西班牙语如果一个单词长期不复习再学新词时很容易把两个语言里的相似拼写搞混。区别在于人脑有海马体做记忆巩固而深度模型没有天然的“睡眠巩固”机制所以必须靠算法设计去模拟这一过程。1.2 CNN时代的方法搬到ViT上为什么不好使早期增量学习的工作大多基于是ResNet这类CNN架构方法可以粗分成三类基于回放rehearsal存旧样本、基于蒸馏distillation保留旧模型输出、基于正则化regularization约束参数更新幅度。这些思路本身是通用的但直接套到ViT上会出现三个明显的适配问题。第一ViT的注意力分布对数据分布更敏感。CNN的卷积核是局部的全量微调时至少低层边缘特征还算稳定而ViT的前几层注意力如果不对齐地训练很容易在新类别数据上发生剧烈漂移。一旦底层注意力的统计量变了后面所有层跟着一起歪遗忘速度比ResNet更快。第二ViT的输出信号比CNN更丰富。CNN时代做蒸馏基本只对最后logits做KL散度网络中间层的特征对齐一般用得不多。但ViT除了[CLS] token还保留了所有patch token这些patch token里包含大量局部语义信息——比如一张“鸟”的图翅膀纹理、喙的形状、背景树木分别存在于不同patch中。如果只约束[CLS]的logits旧类中那些只有少数局部patch能区分的特征还是会被悄悄覆盖掉。第三ViT参数量普遍偏大。标准ViT-B/16大约86M参数全量微调一轮增量任务不仅训练慢而且会把之前学到的通用表征破坏得比较彻底。如果每来一批新类都全量更新成本和效果两头不讨好。1.3 毕设和企业到底需要什么样的交付做这个东西之前我特意把两类使用场景的需求拆开了看。毕设侧导师和评审最关心的通常是方法有没有新意、实验对比完不完整、能不能把问题讲清楚。所以你至少要做消融实验、和经典基线算法对比、画准确率遗忘曲线、展示t-SNE分布变化最好再有一张清晰的系统架构图。单纯调包跑一个iCaRL哪怕分数高答辩时也很难撑住。企业侧业务方和工程师关心的完全是另一套东西模型能不能在单卡上短时间完成增量增量后老类的准确率掉了多少个百分点部署时推理接口会不会变复杂新类别多了以后模型文件、分类头、特征存储是否好维护。这两个诉求经常打架但我觉得可以统一到一套系统里底层算法保证效果工程层做模块解耦学术层补实验可视化。这套系统就是这么设计的。2. 87.58%的构成冻结底座、记忆回放与双层蒸馏的组合打法2.1 总体架构一句话版我的方案可以概括成一句话冻结预训练ViT-B/16底座只训练加在注意力层上的LoRA适配器和可扩展分类头旧类样本通过内存池保留少量代表图像每个增量任务训练时同时计算分类损失、基于[CLS]的logits蒸馏、以及基于patch token的特征分布对齐损失。这套组合不是拍脑袋组出来的。每个模块都在解决一个具体问题LoRA保证参数更新幅度可控内存池提供旧类原始信息logits蒸馏保证决策边界平滑迁移patch蒸馏兜住细粒度局部记忆。四者缺一效果都会明显下降我在后面消融实验里会给出具体数据。2.2 记忆回放哪20张旧图值得留下先解决最朴素的问题完全不给旧数据任何方法都很难长期稳定。所以内存池是必需品。为了平衡存储开销我按“每个旧类固定保留20张图片”来设计随着类别从10类增长到100类内存池最大也就2000张图对单卡训练完全无压力。问题在于这20张怎么选。如果用随机抽样图里会出现大量相互冗余的样本——比如某类全是同一个角度那特征空间覆盖度就很差。我用的是herding算法计算整个类别图片在特征空间中的均值然后迭代地从候选集里选样本让已选子集的均值不断逼近整体均值。直观理解就是“采样出来的图片能代表这一类长什么样”而不是捡了十张背景都差不多的图。def herding_select(features, m): mean features.mean(0) current torch.zeros_like(mean) selected [] for _ in range(m): dist (features - current - mean).norm(dim1) dist[selected] float(inf) idx dist.argmin().item() selected.append(idx) current features[idx] return selected实际效果上herding选出的样本比随机抽样在后期增量任务上平均高出约1.5个百分点而且方差更小。关键原因在于herding保留的是“类内分布骨架”而随机可能只保留了“类内某个簇”。2.3 LoRA适配器为什么不全量微调反而效果更好全量微调ViT在增量场景下的问题我前面提过。那能不能一点也不训也不行。因为初始10类和后续新类可能来自完全不同的数据分布如果底座完全冻结只训练分类头模型早期就会卡在“表达能力足够但适配不足”的状态。LoRA的做法是冻结原权重W而让模型去学习一个低秩增量ΔWAB。推理时实际权重是WAB训练时只需要更新极少量参数。我对ViT-B/16的每个多头注意力的q、v投影层都加了LoRA秩r8缩放因子alpha16。可训练参数量只有大约8M占总参数的0.8%左右。为什么选q和v而不是全都要这是基于实证取舍的q投影主要决定“每个token关注哪里”v投影决定“从关注的地方提取什么”。w投影和输出投影可以保持冻结减少参数量同时控制注意力模式的改变速度。实测下来只加q、v比四个投影全加最终准确率只低0.3%左右但每轮训练时间能省将近一半。LoRA还有一个附加好处如果未来要做多任务扩展可以给每个增量任务挂一个独立适配器推理时按任务ID切换。这个特性在企业场景里很有想象空间用户可以随时为特定领域的专属数据训练一个轻量分支。2.4 双层蒸馏只蒸馏logits远远不够蒸馏是抗遗忘的半壁江山。旧模型在训练前的输出代表“上一轮模型对这张图的判断习惯”新模型在更新参数时我们希望它别把这个习惯改得面目全非。最基础的做法是对logits做带温度系数的KL散度。温度用4.0因为softmax在低温下会“过分自信”只有最高分那个类有信号温度调高后旧模型的“近似判断”——比如觉得A类0.6、B类0.3——这些信息也能传递过来。但ViT还有个得天独厚的优势它有patch token。于是我又加了一项patch token的MSE对齐损失要求新模型在回放样本上的patch特征尽量和旧模型的patch特征一致。为什么这很重要我举个实际例子假设旧类里有一种“蓝色羽毛的鸟”区分特征非常局部可能就集中在中央几个patch中。[CLS]的logits蒸馏只会告诉新模型“最终判断别变”但patch级约束相当于把“中间分析过程也别变”一并带上。在消融里去掉patch蒸馏后后期任务的旧类遗忘率从2.1%升到了4.3%这是很明显的差距。2.5 损失函数组合与权重设定最终每个增量session的训练损失是四部分加权def incremental_loss(logits_new, logits_old, patch_new, patch_old, targets, temp4.0): ce F.cross_entropy(logits_new, targets) log_p F.log_softmax(logits_new / temp, dim-1) p_old F.softmax(logits_old.detach() / temp, dim-1) kl F.kl_div(log_p, p_old, reductionbatchmean) * (temp ** 2) patch_mse F.mse_loss(patch_new, patch_old.detach()) return ce 1.0 * kl 0.5 * patch_mse权重分别设为CE权重1.0KL权重1.0patch MSE权重0.5。这个比例是我在验证集上调出来的。KL太强会抑制新类学习速度patch MSE太强会让新模型过度贴近旧模型的中间特征反而学不进去新类的判别信息。除了这三个损失我还对所有类的分类头向量做了L2约束约束权重0.05。由于分类头的向量其实可以看做一个概念上的“类原型”这个约束防止某个类别的原型向量在增量中被顶得偏离太远。整套设计下来每个增量session的训练参数、损失构成、数据来源都非常清晰写论文时每个模块都能单独解释和消融这其实是我刻意为之的——因为毕设答辩时老师问的每一个“为什么”都必须落到原理上而不是“我在GitHub上抄了个现成代码”。3. 实验协议与关键调参87.58%是在什么条件下测出来的3.1 数据划分与评估指标先明确实验设置避免任何人拿着87.58%去对标其他论文时产生误解。我用的数据集是CIFAR-100。任务划分方式是Class Incremental Learning的经典协议先把100个类随机打乱取前10类作为第0个session基础任务剩下的90类平分到9个session每个session新增10类。训练时当前session只能见到当前类别的训练图以及从内存池里拿到的旧类代表图。测试时把见过所有类别的全部测试图合并成一张评测集计算Top-1准确率。最终报告的87.58%是“所有session结束后对所有已见类别的平均Top-1准确率”学术上通常叫Average Accuracy。另外我还记录了平均遗忘度Average Forgetting反映旧类在后续增量过程中的降幅最终稳定在2.3%左右。3.2 输入分辨率、优化器和训练安排ViT-B/16原生接收224x224的输入而CIFAR-100原始分辨率只有32x32。很多人第一次做实验会直接把图像在数据加载时拉伸到224x224结果是画面模糊严重但预训练模型的强先验可以弥补一部分损失。我在实践中的处理是训练和测试统一将图像双线性插值到224x224同时加RandomCrop、RandomHorizontalFlip和RandAugment做增强。实测证明适量增强能显著提升ViT在低分辨率源图像上的适应能力。优化器用AdamW基础学习率3e-4LoRA层的学习率单独设5e-4因为可训练参数少、梯度信号弱需要稍微大一点的学习率才能让适配器正常收敛。batch size为64基础任务训练30个epoch增量任务默认训练15个epoch。每个session都做5%的线性warmup再走余弦退火。随机种子固定为0每个实验跑3次取均值硬件是单卡RTX 3090。这里有个值得注意的细节LoRA层学习率比主骨干大是因为LoRA初始化时B矩阵为0输出增量一开始就是0梯度信号天然较弱。如果一视同仁用小学习率适配器前几个epoch几乎不动整体训练时间被白白拉长。我踩过这个坑以后专门调了参训练曲线马上顺了很多。3.3 消融实验每拿掉一块准确率掉多少为了说明每个模块的价值我做了一组逐项消融结果如下配置平均准确率平均遗忘度完整方案LoRA回放KLpatch蒸馏87.58%2.3%去掉patch蒸馏只保留logits KL85.32%4.1%去掉内存池只用LoRA蒸馏79.10%9.8%去掉蒸馏CELoRA回放82.66%6.7%全量微调ViT-B/1651.60%32.5%只冻结底座回放不加任何蒸馏76.12%12.0%从表里能明显看到全量微调是最惨的前几个session其实得分不低但越往后旧类被新类冲得越厉害最终才51.60%。而这正是很多人第一次跑ViT增量时的默认操作——以为只要加个回放内存池就万事大吉结果“看着loss在降测试结果却在崩”。去掉内存池的配置同样让人警醒79.10%。没有旧样本输入单纯靠蒸馏和低秩约束前期勉强能维持后期旧类区分度被大量稀释。这说明在ViT上纯粹的正则化派方法不带任何记忆很难撑住长序列增量任务。3.4 简单基线对比在统一协议下的复测为了向毕设评审说明“方法为什么比通用基线路数好”我把几个经典方法在同样协议、同样回放规模下复测了一遍。由于不同开源仓库的实现细节差异很大这个数字只看相对趋势别直接拿到论文里跟别家paper对比。方法同协议复测平均准确率LwF68.50%iCaRL蒸馏回放71.30%BiC带偏置纠正的蒸馏回放74.20%我的组合方案87.58%差距最大的来源不是我发明了新东西而是我把ViT时代的两个关键选择做对了一个是冻结底座用LoRA另一个是加了patch token蒸馏。这两个选择让模型既保留通用特征又不会在新类别上“转向转得太猛”。对毕设论文来说这种“经典方法ViT特化改造”的叙事也比较容易被评审接受。4. 从课题到交付系统拆成四个模块后的工程落地4.1 代码目录设计让论文实验和业务部署共用一套代码很多学生的项目代码是“能跑就行”所有逻辑堆在几个大文件里换数据集要改七八处测试时调参还得盯控制台。这样的代码写进毕设可能还能应付但企业合作方拿去接内部平台基本没法用。我的做法是在项目初期就分模块最终目录结构大致如下vit-incr/ ├─ configs/ │ └─ cifar100_incr.yaml # 数据集、模型、训练超参全部走配置 ├─ data/ │ ├─ cifar100.py # 数据集加载与任务划分 │ └─ memory_buffer.py # 内存池herding抽样、更新、存取 ├─ models/ │ ├─ vit_lora.py # 冻结底座LoRA适配的ViT封装 │ ├─ prototype_head.py # 可动态扩展的分类头 │ └─ losses.py # 增量损失函数 ├─ trainers/ │ └─ incremental_trainer.py # 增量训练循环、蒸馏、评测 ├─ serve/ │ └─ export_onnx.py # 推理模型导出脚本 └─ run_incremental_cifar100.py # 主入口这套结构里最常见的误区是分类头直接用nn.Linear(embed_dim, num_classes)每来一个新session就重新建一个更大的线性层。这样设计在代码层面能跑但工程上有两个隐患一是导出模型时维度总在变部署端难处理二是旧类权重可能在训练中被大幅改动没有显式的约束载体。我在代码里单独写了一个PrototypeHead用每个类别的特征向量均值作为分类向量推理阶段对特征和所有类向量做余弦相似度。用户只看接口的话它和普通分类层用法一致。4.2 核心训练流程与接口设计增量训练主循环的骨架关键思路是先做herding样本补充再训练当前session最后用全量旧类测试集评估。顺序很重要如果先训再抽抽出的是“已经被新模型处理过的特征”抽样标准会被污染必须用旧模型的特征来抽旧样本。# 伪代码一个增量session的完整动作 old_model build_model() queries, targets build_current_session_data() # 1. 用旧模型特征对当前任务新类做herding抽样并更新内存池 mems MemoryBuffer.from_old_pool(args.memory_per_class) mems.merge(herding_select(current_features, args.memory_per_class)) # 2. 构造可扩展分类头新类向量加入 head.expand(new_class_ids) # 3. 增量训练损失来自 CE KL PatchMSE trainer.fit(old_model, model, combined_loader) # 4. 重新计算所有类别的原型向量 model.recompute_prototypes(all_ref_features)第四步是很多人会漏掉的关键动作。因为在增量训练之后特征空间虽然变化不大但并不是完全不变。分类向量如果还停留在上一轮session结束时的值和新特征之间就会产生系统性偏差。每轮增量结束我都对所有类别重新抽一次特征并算一次均值这个小操作能让最终准确率稳定提高1-2个百分点。4.3 从PyTorch到ONNX的导出以及动态分类头的处理企业同事最关心的通常是“你训练的东西我能不能用标准工具链部署”。PyTorch模型虽然在推理侧也能跑但接入生产环境时ONNX Runtime和TensorRT是更常见的选项。增量学习系统在导出时有一个麻烦点分类头的类别数量是动态增长的如果每次增量后都要改计算图部署方会崩溃。我的处理方式是把“分类头”从计算图里拆出来。ViT骨干和LoRA合并权重后导出为的ONNX模型只输出特征向量输出维度固定为768。分类逻辑放在ONNX之外用一个独立的类别向量表存储查询阶段做矩阵乘法softmax。这样每次新增类别只需要往类别向量表里追加一行ONNX模型完全不用重新导出。ONNX导出要注意LoRA权重合并的细节。训练时模型的权重是W alpha/r * AB导出前要把LoRA的增量合并进原权重并清理掉低秩分支否则ONNX里会多出一些不必要的节点增加推理延迟。python export_onnx.py --checkpoint latest.pt --output vit_encoder.onnx --opset 12 --dynamic-batch推理阶段用ONNX Runtime加载实测在CPU上单张224x224图片推理时间约18ms用TensorRT在T4 GPU上可以压到2ms以内。这个性能对大多数业务分类场景完全够用。4.4 毕业论文展示和企业POC的侧重点差异同一个系统面对两类受众展示方法可以完全不同但底层代码不用改。写毕业论文时我建议把多个session的分类准确率画成曲线图每个session结束以后记录一个点观察曲线是否平滑下降而不是在某一步突然断崖。同时把内存池里herding选出的图可视化和随机抽样选出的图做对比评委看完能直观理解“选样本”这个模块是在做什么。另外t-SNE图建议在最后一个session结束后画把所有已见类别的特征投影到二维平面观察新老类之间的边界是否清晰、有没有明显混叠。这张图几乎是答辩时的亮点图。企业POC演示时重点则是现场“增量训练”的流程准备一个包含10个新类的小数据包当场在单卡上跑一到两个epoch展示训练脚本自动更新类别向量表和模型文件随后立即用新老混合测试集验证实拍效果远比PPT说服力强。企业方看到“30分钟训练完成、老类准确率基本不动”通常很快就能理解这套系统的价值边界。5. 踩坑复盘ViT增量学习里最不值得重复的五个教训5.1 新类分类头初始化不当准确率被拖低2%第一次跑通的时候我的可扩展分类头对新增类别的向量是随机初始化的。结果每次新session的前几个epoch分类损失下降很快但旧类的logits被新类随机向量干扰得很明显。后来我把新类向量的初始化改成“旧类向量的均值”新类随机向量均值乘以一个小系数叠加。这个改动看起来不起眼但实际上让新session初期就有一个大概合理的决策面旧类的准确率波动小了很多。更彻底的做法是用“零样本三角”技巧新类向量初始化为0推理时用余弦相似度距离而不是内积。因为内积可以保证“初始时新旧类区分不清但不偏向任何一边”模型再用梯度慢慢把新类向量推到该在的位置。实测比随机初始化高约2个百分点。5.2 LoRA学习率设成1e-3旧类遗忘率翻倍一开始我图省事给所有可训练参数用同一个学习率1e-3。训练曲线显示LoRA层在1e-3下适应得很快但蒸馏损失上升得也很快——模型为了拟合新类把注意力分布整体带偏旧类推理结果迅速退化。把LoRA学习率降到5e-4之后虽然新类准确率的收敛会慢一点但遗忘率从9%降到了2.3%。这里分享一个判断方法在训练过程中单独记录旧类回放样本上的分类准确率如果这个数字在下降趋势明显说明学习率太高或蒸馏权重太弱。把这张图挂到log里比只看训练loss靠谱得多。5.3 验证集和回放池“撞车”论文指标虚高我在前几版实验里直接拿测试集评估每个session的结果——看起来很好但因为回放池里的样本也来自训练集我训练时其实“见过”这些训练图了这没问题。真正的坑在于我后来用测试集的同一批图做“proto校正”参考特征这就相当于让模型在评估时偷偷看了一眼同类分布。严格来说原型向量必须只从训练集特征计算测试集只能用于最终一次性的分类准确率评估。如果两者混用指标会虚高1%-3%而且非常容易被评审或同事质疑。5.4 单卡资源下的训练时间别把系统做成只有A100才能跑的方案ViT-B/16在224x224输入下单个epoch在3090上大约1.2分钟基础任务30轮约35分钟增量任务15轮大约18分钟。整套9轮增量加基础任务跑完不到4小时。这个训练成本对毕设和企业POC都是可以接受的。如果换成更大的ViT-L或者直接全量微调训练时间会翻好几倍而且需要更大显存。企业同事根本不会等你训练一整天再演示所以“单卡、短训、即可观察效果”本身就是这套系统的设计目标之一。5.5 别只看平均准确率还要盯每个类别的“遗忘排行榜”最后一个教训来自一个看起来“分数不错但实际很危险”的模型状态。某次跑完实验平均准确率87.3%看起来还好但按类别拆分后发现有三个旧类的准确率从原来的80%多直接跌到50%以下。平均分掩盖了这个结构性遗忘问题。增量学习的最终检验标准不是“平均分好看”而是“最差的旧类也不能崩”。我的处理方式是在每个session结束后输出一份“类别遗忘排行榜”按当前准确率-历史最高准确率的降幅排序。任何类别降幅超过15%就要检查是内存池样本不足、还是该类别和其他新类在特征空间上过度重叠。这招对企业评审时也特别有用——你可以指着榜单说“我知道哪个类最容易忘而且我有机制去监控它”。最后再分享一个可能对你有用的习惯每完成一个session的增量训练我会把所有类别的原型向量基于新特征空间重算一遍。这个方法成本极低但对最终准确率的稳定贡献很明显而且在公开代码里很容易被漏掉。如果你打算复现这套系统不妨先加上这一步再跑对比。完整的代码目录、训练配置和导出脚本我整理在一个公开仓库里按标题里的关键词就能找到直接pip install依赖后跑主入口即可复现CIFAR-100上的87.58%。

相关新闻

基于PyTorch的MLP矿物成分分类中的平均值填充策略

基于PyTorch的MLP矿物成分分类中的平均值填充策略

矿物成分数据这件事,我是在前两篇把数据探索和基础特征工程做完之后,才真正开始纠结缺失值怎么处理的。这个系列写到第三篇,核心任务其实已经收敛得很清楚:拿一批带有缺失值的成矿元素分析数据,走完从预处理到模型训练…

2026/10/18 10:42:23 阅读更多 →
Mini-batch SGD:小批量随机梯度下降原理与调参实战

Mini-batch SGD:小批量随机梯度下降原理与调参实战

训练神经网络时最让人头疼的,往往不是网络结构怎么搭,而是那个叫作“优化器”的东西怎么选、怎么调。你费劲心思把数据处理好、模型搭起来,结果loss跟心电图一样乱跳,或者卡在一个平台期死活下不去,这时候八成就是优化…

2026/10/17 4:13:03 阅读更多 →
多组学癌症预后预测系统设计与实践:从数据融合到应用部署

多组学癌症预后预测系统设计与实践:从数据融合到应用部署

多组学癌症预后预测系统,这个方向我前后折腾了大半年,踩了不少坑,也积累了一些实打实的经验。项目最初的需求很简单:整合基因组、转录组、表观遗传等多个层面的数据,构建一个能辅助临床预后判断的系统。但真正做起来才…

2026/10/17 4:13:03 阅读更多 →

最新新闻

免费GEO监测体系搭建:从指标到内容优化的AI搜索实战指南

免费GEO监测体系搭建:从指标到内容优化的AI搜索实战指南

过去大半年,我几乎每周都会打开一张统计表,记下几组固定问题在各类AI搜索平台里有没有“带出”我负责的网站。说实话,刚开始做这件事的时候,很多同行觉得我是在自嗨:内容能被搜索引擎收录就不错了,谁还管AI…

2026/10/18 10:41:49 阅读更多 →
Linux下NVML初始化失败的系统级诊断与修复

Linux下NVML初始化失败的系统级诊断与修复

1. 这不是驱动装错了,是系统底层状态被悄悄污染了“安装NVIDIA推荐驱动报错”“nvidia-smi报错 Failed to initialize NVML”——这两句话在Linux图形工作站、AI训练服务器、甚至普通深度学习开发者的终端里,出现频率高得反常。我见过太多人反复卸载重装…

2026/10/18 10:41:49 阅读更多 →
SpringBoot图书馆系统实战:从分层设计到借阅事务落地

SpringBoot图书馆系统实战:从分层设计到借阅事务落地

简介:本资源是一套完整的毕业设计级图书馆管理系统实现方案,面向计算机专业本科生及SpringBoot初学者,解决高校课程设计、毕设开题与系统开发实践中的典型业务建模与全栈实现问题。系统基于SpringBoot 2.x构建,采用前后端分离架构…

2026/10/18 10:41:49 阅读更多 →
MATLAB论文级盒图绘制全指南:从数据理解到期刊排版实操

MATLAB论文级盒图绘制全指南:从数据理解到期刊排版实操

前几天一个来问我论文图的同学,把同一份数据画成了两种图给我看:一张是经典的“均值标准误”条形图,另一张是盒图。数据明明差不多,但盒图里那个刺眼的离群点,在条形图里完全看不出影子。这种感受,我相信改…

2026/10/18 10:41:49 阅读更多 →
深度学习故障诊断的成败关键:从振动信号到数据管线的工程实践

深度学习故障诊断的成败关键:从振动信号到数据管线的工程实践

简介:这是一份面向机械故障诊断学习者的深度学习实战资源包,聚焦利用Python构建故障预测与识别模型,解决设备振动、温度等多传感器数据的高效分析问题。包内整合数据预处理、特征工程、模型构建与训练评估等环节的代码实现与项目组织思路&…

2026/10/18 10:41:49 阅读更多 →
交换机MAC地址学习与VLAN转发机制:802.1Q标准深度解析

交换机MAC地址学习与VLAN转发机制:802.1Q标准深度解析

简介:IEEE Std 802.1Q-2022 是 IEEE 发布的局域网与城域网桥接网络技术标准最新版,面向网络设计师、工程师及运维技术人员,用于解决 VLAN 划分、流量隔离、链路聚合与多速率端口适配等实际组网问题。资源包内含 1 个 PDF 文件,大小…

2026/10/18 10:40:49 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 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/18 0:55:02 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →