Transformer NLP落地实践:从注意力机制到微调避坑指南
简介《Transformers for Natural Language Processing》是一本聚焦 Transformer 架构的 NLP 专著面向具备一定 Python 基础、希望系统掌握先进深度学习模型的开发者与研究人员。该书由 Denis Rothman 撰写内容循序渐进先从原始 Transformer 讲起再过渡到 BERT、RoBERTa、DistilBERT并讨论小型 Transformer 在特定任务中胜过 GPT-3 的案例随后覆盖自然语言理解NLU与自然语言生成NLG应用最后深入社交网络分析与假新闻识别等高级任务。全书还结合 Hugging Face、Trax、AllenNLP 等平台指导读者用 Python、TensorFlow、Keras 实现情感分析、文本摘要、机器翻译等实践。资源包为单个 PDF 文件共 1 个文件压缩后约 4.72MB已有 1966 人学习适合系统掌握预训练 Transformer 模型并直接参考代码示例落地 NLP 任务。1. 拿到《Transformers for Natural Language Processing》这份资料先别急着翻结构图上周某开发者的团队在做同一批情感分类数据双向LSTM调到82%就上不去了换了一套12层Transformer预训练模型一夜到91%但推理速度慢了近十倍。这个对比很能说明问题——Transformer从来不是一个“模型”而是一整套从注意力机制、位置编码到预训练、微调、部署的方法论。当你拿到《Transformers for Natural Language Processing》这类资料最容易犯的错是盯着架构图看半天却不知道输出层怎么接、mask怎么传、学习率设多少。这篇文章就按我实际做项目的顺序来讲先把注意力机制看明白再用最小代价把微调流程跑通最后解决长文本、速度和稳定性这些绕不开的坑。适合已经用RNN或CNN做过NLP、现在想切到Transformer阵营以及已经在用但经常翻车的朋友。2. Transformer的NLP落地原理注意力机制、位置编码与架构选型2.1 多头自注意力并行计算如何改变NLP任务的处理方式Transformer能替代RNN的最根本原因是自注意力让序列中任意两个位置的信息可以直接交互不需要像LSTM那样按时间步挨个传递。Q、K、V三个矩阵来自同一个输入经过线性变换后的结果注意力权重就是“当前词”和“序列里其他词”的匹配度。import torch import torch.nn.functional as F def scaled_dot_product_attention(q, k, v, maskNone): # q/k/v 形状: (batch, heads, seq_len, head_dim) d_k q.size(-1) scores torch.matmul(q, k.transpose(-2, -1)) / (d_k ** 0.5) if mask is not None: scores scores.masked_fill(mask 0, -1e9) weights F.softmax(scores, dim-1) return torch.matmul(weights, v), weights这段代码里有一个关键细节除以d_k ** 0.5缩放因子。当向量维度变大时点积结果会迅速增大softmax容易陷入梯度极小的区域缩放之后注意力分布才不至于过尖。mask 在 -1e9 的位置上会把对应分数置为负无穷经过softmax后权重归零这是处理padding和因果约束的通用做法。多头注意力就是把这个计算拆成多组并行做每组用自己的Q/K/V线性变换最后拼接。我常用的解释是不同头在训练中会自动分化有的头偏向相邻词依赖有的头关注长距离指代关系。这对下游任务的收益是实打实的——尤其命名实体识别和关系抽取多个头能覆盖不同模式这是单头注意力做不到的。2.2 位置编码与因果掩码两个容易被忽略但决定任务成败的细节注意力本身不感知词序所以Transformer必须额外注入位置信息。常见方案有两种一是不需要训练的正弦位置编码用不同频率的正余弦函数表达相对位置二是可学习的位置嵌入让模型在训练中自己调整。对于短文本分类两者差别不大对于长文档或跨语言任务正弦编码的平移不变性更有优势。因果掩码则是生成任务和分类任务的分水岭。做文本生成时第i个token只能看到前i个token所以要在注意力分数矩阵的上三角部分打mask做句子分类时用的是双向编码器每个token都能看到整个序列。很多初学者把两种掩码用混了导致生成模型出现“作弊”式的异常高分部署后一推理就崩。2.3 选型预训练微调与从零训练各自适合什么场景我接到新项目时第一个决策不是选模型大小而是判断要不要用预训练。如果业务数据只有几千条、标注成本高从零训练Transformer几乎必败这时候微调开源预训练模型是唯一务实路径。如果数据量在百万级而且领域术语占比极高比如法律文书或病例文本则可以先在领域语料上做继续预训练再跑下游微调。判断条件微调预训练模型从零训练Transformer标注数据量小于10万条百万级起步算力预算单卡可跑多卡训练数周领域特殊性通用数据可用专业术语必须覆盖上线周期几天内出基线以月为单位我一般会用小模型编码器6层左右跑通流程再决定是否换大模型。这个阶段解决的是“能不能跑通”不是“效果好不好”。3. 用最小代价把Transformer微调跑通数据规范、训练与推理落地3.1 环境准备与数据规范最容易被低估的半小时先装依赖我建议一次性装齐pip install transformers torch accelerate datasets注意不要追新能装到当前稳定版即可。装完之后第一步不是写模型而是先把数据整理成固定格式。以文本二分类为例label,text 1,售后电话一直打不通客服也没有回复 0,发货很快包装也很完整文件编码务必存成UTF-8BOM头会直接让第一行label解析失败。最好在写入CSV之前就把换行符和非法字符清一遍。这一步如果偷懒后面所有乱码排查都会从这里冒出来。from transformers import AutoTokenizer tokenizer AutoTokenizer.from_pretrained(./pretrained_model) # 用本地目录加载tokenizer避免每次启动都联网 def encode_example(text, max_len128): return tokenizer( text, truncationTrue, # 超长截断默认从右侧截 paddingmax_length, # 统一padding到max_len max_lengthmax_len, return_tensorspt )这段代码确定了两件事超长文本怎么截、短文本怎么补。truncationTrue对分类任务通常够用但对长文档要换策略后面第5章会专门说。paddingmax_length会让batch内所有样本长度一致训练时省心如果为了省显存可以只在batch内贴齐paddinglongest。3.2 微调完整流程数据加载、训练循环与评估我常用的方式是直接用Trainer把训练细节封装起来把精力放在数据和评估上from transformers import AutoModelForSequenceClassification, Trainer, TrainingArguments from datasets import Dataset train_ds Dataset.from_pandas(train_df) eval_ds Dataset.from_pandas(eval_df) model AutoModelForSequenceClassification.from_pretrained( ./pretrained_model, num_labels2 ) args TrainingArguments( output_dir./output, per_device_train_batch_size16, per_device_eval_batch_size32, learning_rate2e-5, warmup_ratio0.1, num_train_epochs3, evaluation_strategyepoch, save_strategyepoch, logging_steps50, fp16True, # 显存紧张时开启 ) trainer Trainer( modelmodel, argsargs, train_datasettrain_ds, eval_dataseteval_ds, tokenizertokenizer, ) trainer.train()这里的几个参数值得多说一句。learning_rate2e-5是我做分类任务的默认起点预训练模型已经被训练得很充分内部特征已经很好了学习率太大反而会破坏已有权重。warmup_ratio0.1表示前10%的step学习率从0慢慢升到设定值防止刚开始时出现巨大loss尖刺。per_device_train_batch_size16背后是显存约束不够就把 batch 调小、开着梯度累积做补偿这个下一章会细讲。验证集评估建议额外加一个指标函数只看loss不够直观。常见做法是在后面接compute_metrics返回准确率、F1等指标。另外我习惯把评估集单独留出不要和训练集有任何交集避免验证集分数虚高。3.3 从训练环境到生产环境推理脚本与导出注意事项训练完成后保存模型和tokenizer再写一个独立推理脚本from transformers import pipeline classifier pipeline( sentiment-analysis, model./output/checkpoint-final, tokenizer./pretrained_model, device0 # 用GPU-1表示CPU ) result classifier(售后电话一直打不通) print(result) # [{label: LABEL_1, score: 0.98}]这里有个隐藏问题pipeline默认会自己做分词和padding但它的默认参数未必和你训练时一致。比如训练时max_length128pipeline可能默认512导致推理时输入被padding得更长速度变慢却不会报错。我的做法是显式传truncationTrue, max_length128这类参数保证训练和推理在预处理上完全对齐。生产环境如果对latency敏感建议导出为ONNX。导出前必须固定序列长度和padding策略ONNX图一旦生成动态长度支持有限。这个步骤很容易踩坑所以第5章会单独列出。4. 决定微调效果的三个关键配置序列长度、学习率与批大小4.1 max_length怎么定按任务特性而不是按显存max_length 是最常被随意设置的一个参数但它的影响远不止显存。分类任务把长度设为128基本够用文本匹配需要同时塞进两个句子设成256更稳抽取式阅读理解要看原文长度512是常用上限。我常用这个参考表任务类型建议max_length截断策略短文本分类128右侧截断文本匹配/蕴含256双句拼接后右侧截断抽取式问答/长文档分类512或以上滑窗分段不直接截断文本生成按目标长度输入预算左侧保留输入右侧生成长文本直接截尾会丢失答案在文末的情况这是我在某图像处理Demo的文本分析项目里踩过的真坑。长文本场景要么滑窗切段再聚合结果要么换成支持更长序列的注意力变体把想要的信息保住再谈长度。4.2 学习率与warmup预训练模型微调的“玄学”就在这我见过很多新手的loss曲线是一条反复震荡的锯齿线多半是学习率设到了1e-4以上。预训练模型微调不是从零训练学习率过大的后果非常直接模型在第二个epoch就把原有的通用语义冲掉了验证集分数不升反降。from transformers import get_linear_schedule_with_warmup total_steps len(train_ds) // batch_size * epochs scheduler get_linear_schedule_with_warmup( optimizer, num_warmup_stepsint(total_steps * 0.1), # 10%的warmup num_training_stepstotal_steps )warmup阶段让模型先“适应”当前数据分布再用正常学习率去学。一般5%到10%是比较稳的区间。如果loss在第一个step就飙到几十先看学习率是不是大了再看数据预处理有没有问题。个别情况下某个batch里混入了脏数据也会让loss突然跳高但那是偶发现象和warmup失效是两种完全不同的形态。4.3 显存不够批大小与梯度累积的配合方式12层Transformer的显存占用大头在中间激活值而不是模型参数。batch size设16显存爆了设8能跑但效果觉得不稳可以用梯度累积来模拟更大的有效批大小accumulation_steps 4 # 连续累积4个batch再更新一次 optimizer.zero_grad() for step, batch in enumerate(train_loader): outputs model(**batch) loss outputs.loss / accumulation_steps # 平均保证loss尺度一致 loss.backward() if (step 1) % accumulation_steps 0: optimizer.step() scheduler.step() optimizer.zero_grad()这里有个容易被忽略的点loss outputs.loss / accumulation_steps。如果不做这个除法梯度累积后的loss会比预期大4倍等效学习率被放大可能导致loss曲线整体偏高甚至直接发散。梯度累积不等于把batch size真实变大只是逼近大数据量下的稳定性影子BN之类的操作在预训练模型里很少用不用太纠结。显存还紧张的话可以开启梯度检查点用少量计算换显存训练时间会拉长15%到30%但至少不会OOM中断。5. Transformer微调避坑手册5个高频问题与排查思路5.1 训练集loss正常下降验证集分数反而持续走低现象训练top1准确率一路走高到95%以上验证集却停在80%附近不再上升甚至开始往下掉。原因八成是过拟合但还有两成是评估配置和训练配置不一致。比如训练时用了数据增强、shuffle验证时忘了关掉dropout或者忘了用model.eval()。另一个常见原因验证集里混入了重叠样本或重复样本让评估结果看起来比实际好。解决先确认验证代码里是否处于torch.no_grad()且模型切到eval模式再把学习率降到1e-5加权重衰减或减小模型层数换小的预训练模型。最省事的方法提前留出10%的训练数据当验证集训练完再去跑真正的测试集。5.2 推理结果出现乱码标签序号和文本对不上现象训练时一切都好部署后用pipeline推理返回的标签和实际业务含义对不上或者中文文本被切成了乱码。原因label和id的映射表在训练时正确但推理时没有同步加载更常见的是加载模型时tokenizer用了不同的本地路径预训练模型自带词表目录没拷全导致分出来的词和训练时完全是两种粒度。解决保存模型时把model.config.id2label和label2id一起存下来推理时直接读取tokenizer所在的目录一定要和模型文件放在一起剪贴复制时检查是否漏了vocab.txt之类的词表文件。推理前打印一条输入文本的分词结果肉眼确认一遍中文分得对不对。5.3 微调时频繁OOM连batch size降到4都撑不住现象训练跑到第10个step就报CUDA out of memorybatch从16降到8、4都没用问题依旧。原因某些GPU上显存碎片化严重模型加载后可用空间已经不多加上长序列的激活值占用小batch也扛不住。更隐蔽的原因是设置max_length512的文本太多实际seq_len远高于128计算量按平方增长。解决先把max_length降到64验证OOM是否消失确认是长度导致再考虑滑窗或降长度然后开梯度检查点model.gradient_checkpointing_enable()。还不行就换更小的预训练模型。把“OOM就调batch”这种习惯改掉第一步先看序列长度这个顺序能省很多时间。5.4 长文本任务的效果比短文本差一大截现象同一套模型处理128字以内文本F1接近90%处理几千字长文档直接掉到70%以下。原因位置编码的外推问题。训练时见过的序列长度就是512推理时给超过512的输入位置编码从未见过注意力分数分布会异常。而且长文本中关键信息可能出现在首尾两端简单截断正好把答案截掉。解决长文本先滑窗分段每段独立预测再对结果做投票或加权如果业务必须一次处理全文就选支持长序列的注意力变体如稀疏注意力或窗口注意力结构。这个问题的关键在“信息保持”而不是模型变得更强。5.5 同一条文本两次推理结果差异很大现象模型不做任何更新同一条输入数据推理两次输出的分类结果或生成结果明显不同甚至分数波动超过5个百分点。原因模型忘记切到eval模式dropout仍在生效导致前向传播的路径随机。另外一个被低估的原因是融合或解码时的随机采样在生成任务里放开比如temperature或top_p被设置成了随机性较大的值。解决推理代码里显式调用model.eval()并用with torch.no_grad():包住前向如果是生成任务检查解码参数里do_sampleTrue是否真的需要要稳定输出就把temperature调低或改成贪心解码。做完这两步同一条数据的前后两次结果应该完全一致在确定性算子和无随机seed偏差的前提下。6. 进阶技巧把注意力权重抽出来验证模型到底学到了什么微调结果如果和预期不符我第一件事不是调参而是看注意力分布。具体做法是注册attention hook把某一层的注意力矩阵抽出来配合bad case一起分析。def extract_attention(model, tokenizer, text): inputs tokenizer(text, return_tensorspt) with torch.no_grad(): outputs model(**inputs, output_attentionsTrue) # outputs.attentions 是list每个元素形状为(batch, heads, seq_len, seq_len) attn outputs.attentions[-1][0] # 最后一层去掉batch维度 avg_attn attn.mean(dim0) # 对所有注意力头取平均 return avg_attnoutput_attentionsTrue会让模型在前向时额外返回各层注意力权重。把这些权重和分词后的token对齐做成热力图能直接看出某条分类错误的样本是不是注意力全堆在停用词上或者关键实体完全没人关注。我在某模拟项目X的诉讼文书分类里靠这个方法发现模型始终在关注“依据”和“法院”这类高频词而真正的争议焦点字段被忽略了后面通过调整输入模板把字段名显式拼进文本F1一次性提了4个点。这个技巧在熟手手里是调试定位器在项目复盘时也是最好的解释材料。遇到业务方质疑模型“没有逻辑”的时候一张注意力热力图比一堆指标更有说服力。另外一个值得试的进阶方向是模型蒸馏和量化。训练好的大模型先当老师把logits软标签传给一个小模型推理体积能缩到原来的三分之一以下量化到 int8 之后CPU上的推理也可以达到可用速度。但量化前先验证评估集分数损失别让压缩把辛苦调出来的两三个点全还回去。我做Transformer NLP项目最大的教训就是永远先确认数据对齐和配置一致再怀疑模型能力。很多所谓“模型玄学”最后都定位在预处理或推理配置上。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

AI不会杀死SaaS而是重写:AI原生SaaS架构与权限隔离实战

AI不会杀死SaaS而是重写:AI原生SaaS架构与权限隔离实战

1. 背景:为什么行业一度喊出“AI杀死SaaS”1.1 “AI杀死SaaS”的说法从哪来过去两年大模型能力快速提升,行业里出现了一种非常流行的判断:用户不再需要订阅 SaaS 软件,直接跟 AI 对话就能生成报表、写合同、做分析、跑流程。按这个…

2026/10/12 14:40:32 阅读更多 →
长三角中小制造企业加速转向轻量化预测性维护,设备被动抢修模式逐步退场

长三角中小制造企业加速转向轻量化预测性维护,设备被动抢修模式逐步退场

在长三角密集的离散制造车间里,设备突发停机带来的订单延误、返工、产能损失,正倒逼企业重构设备管理体系。过去多年,多数中小工厂执行固定周期的预防性保养,容易出现两种极端:设备完好却强制停机维保造成产能浪费&…

2026/10/12 14:40:41 阅读更多 →
测试时策略优化TTPO:让强化学习模型在部署后继续在线适应

测试时策略优化TTPO:让强化学习模型在部署后继续在线适应

我们在做强化学习或者大模型对齐工作时,通常已经形成了某种固定流程:在训练环境里用策略梯度把策略跑起来,调好超参,收敛后保存模型权重,部署后就用固定权重做决策。这套流程很成熟,但它无意识里藏了一个很…

2026/10/12 14:40:49 阅读更多 →

最新新闻

多智能体电梯群控:基于目的楼层预约与PPO的深度强化学习实现

多智能体电梯群控:基于目的楼层预约与PPO的深度强化学习实现

简介:本资源是一套面向计算机、人工智能、自动化等专业学生的毕业设计与课程设计实践项目,聚焦于多智能体协同下的电梯群控优化问题,采用深度强化学习实现目的楼层预约调度算法,解决传统电梯响应延迟高、能耗大、乘客等待时间长等…

2026/10/13 19:14:30 阅读更多 →
语义分割环境搭建:PyTorch CPU与GPU版本安装及验证全攻略

语义分割环境搭建:PyTorch CPU与GPU版本安装及验证全攻略

1. 系列前情回顾与本期核心目标语义分割学习系列写到第四篇,前面几篇我分别梳理了语义分割的基本概念、常见数据集的组织方式、以及几个主流分割模型的结构差异。按照正常的学习路线,理论铺垫到这一步,接下来就该动手了。动手的第一步就是装环…

2026/10/13 19:14:30 阅读更多 →
Spring Boot配置绑定实战:@ConfigurationProperties原理与避坑

Spring Boot配置绑定实战:@ConfigurationProperties原理与避坑

接触Spring Boot这些年,我做得最多的一个动作就是替同事定位“配置不生效”的诡异问题。排查到最后,十有八九都落在同一个注解上——ConfigurationProperties。它看起来只是给配置类加个前缀声明,实际牵扯到数据绑定、松散命名、第三方注册、…

2026/10/13 19:14:30 阅读更多 →
语义分割必备:PyTorch CPU/GPU版本安装全攻略

语义分割必备:PyTorch CPU/GPU版本安装全攻略

废话不多说,直接进入正题。这一篇是这个系列的第四篇,主题是很多人在语义分割学习中绕不过去的第一道坎——CPU和GPU版本的PyTorch及其环境安装。前几篇我们聊了语义分割的数据标注、模型结构、评价指标,但真正动手跑代码的时候,你…

2026/10/13 19:14:29 阅读更多 →
Java核心知识点全解析:从JVM到并发编程的底层原理

Java核心知识点全解析:从JVM到并发编程的底层原理

做Java开发这些年,我有一个很深的感受:真正拉开水平差距的,不是谁背的框架更多、API记得更熟,而是对底层那批核心知识点有没有吃透。所谓“Java重要知识点”,不是让你背八股文,而是帮你在遇到线上问题时&am…

2026/10/13 19:14:29 阅读更多 →
Go监听MySQL binlog实战:轻量级数据变更捕获与生产避坑指南

Go监听MySQL binlog实战:轻量级数据变更捕获与生产避坑指南

1. 这不是“监听MySQL”,而是重建一套轻量级数据变更管道很多人第一次看到“用Go监听binlog”这个说法,第一反应是:“MySQL自己不就有mysqlbinlog命令吗?再不济写个Python脚本调用一下不就完了?”——我试过&#xff0…

2026/10/13 19:13:29 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 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/12 21:05:09 阅读更多 →
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/12 18:11:17 阅读更多 →