🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。
📌特别说明:
文中问题案例来源于真实生产环境与公开技术社区,并结合多位一线资深工程师与架构师的长期实践经验,经过人工筛选与AI系统化智能整理后输出。文中的解决方案并非唯一“标准答案”,而是兼顾可行性、可复现性与思路启发性的实践参考,供你在实际项目中灵活运用与演进。
欢迎你关注、收藏并订阅本专栏,与持续更新的技术干货同行,一起让问题变资产,让经验可复制,技术跃迁,稳步向上。
📢 问题描述
详细问题描述如下:
window使用darknet训练生成权重文件问题:window使用darknet训练生成权重文件,为什么训练两天只生成一个权重文件
如下为相关截图:
全文目录:
- 📢 问题描述
- 📣 请知悉:如下方案不保证一定适配你的问题!
- ✅️问题理解
- ✅️问题解决方案
- 🟢方案 A:先确认“是不是正常覆盖 + 迭代没到阈值”(最快定位,强烈推荐)
- 🔵方案 B:你想“生成更多权重快照”,就调小保存间隔(可控、最符合你需求)
- B1(推荐):直接用 AlexeyAB 版(天然有 100/1000 保存策略)
- B2(进阶):改源码 `src/detector.c` 自定义保存频率(你提到 C 语言,这个很适合)
- 🟡方案 C:其实你已经“保存很多次”了,只是 Windows 资源管理器看起来像“只有一个”
- 🔴方案 D:训练太慢导致两天迭代都没到 1000(最容易被忽略,但概率很高)
- ✅️问题延伸
- 1)`last.weights`、`_xxxx.weights`、`final.weights` 各有什么意义?
- 2)为什么很多教程说“原版只有每 10000 才保存一次”?
- ✅️问题预测(你接下来可能会遇到的坑)
- ✅️小结
- 🌹 结语 & 互动说明
- 🧧 文末福利:技术成长加速包 🧧
- 🫵 Who am I?
📣 请知悉:如下方案不保证一定适配你的问题!
如下是针对上述问题进行专业角度剖析答疑,不喜勿喷,仅供参考:
✅️问题理解
你这个现象(训练两天,backup 里只看到一个*_last.weights)在 Darknet(尤其 Windows 下)非常常见,通常不是“没保存”,而是下面两类情况之一:
- 这是正常行为:
*_last.weights会被反复覆盖
Darknet/YOLO 训练时会周期性保存权重,但“last”文件名固定,所以每次保存都会把上一次的yolov3-voc_last.weights直接覆盖掉 —— 你在资源管理器里当然永远只看到“一个文件名”。
AlexeyAB 的 Darknet README 里明确写了:
*_last.weights每 100 iterations 保存一次(覆盖式)*_xxxx.weights每 1000 iterations 保存一次(累积快照)
- 确实没有生成
*_1000.weights / *_2000.weights ...快照
这通常意味着:
- 你训练两天迭代数还没到 1000(尤其是没用 GPU 时,可能非常慢)
- 或者你用的是pjreddie 原版 Darknet(原版在 iterations>1000 后才开始每 10000 保存一次,快照非常少)
- 或者
.data里的backup=路径配置/权限问题导致快照没写进去(写失败你没注意到)
从如上截图看:只有
yolov3-voc_last.weights,这至少证明 Darknet 有在保存,只是“快照保存策略/迭代进度/路径”导致你没看到更多文件
✅️问题解决方案
🟢方案 A:先确认“是不是正常覆盖 + 迭代没到阈值”(最快定位,强烈推荐)
A1. 先看训练窗口输出的迭代编号(最关键)
Darknet 训练时控制台会一直输出类似:100: ... avg ...200: ...900: ...1000: ...
你只要看一下当前打印到多少(比如 300、800、1200),立刻能判断:
- 如果 <1000:那你只会看到 last 覆盖文件(因为还没达到每 1000 次生成一次
*_1000.weights的阈值) - 如果 >1000 但仍没有
*_1000.weights:那就要查“版本/保存间隔/路径权限”。
✅你也可以直接在训练时观察是否出现类似日志:
Saving weights to backup\yolo-obj_1000.weights
如果没有,说明根本没到保存点或保存逻辑不同。
A2. 你用的是 AlexeyAB 版还是 pjreddie 原版?(决定保存策略差异)
- AlexeyAB README 明确:
last每 100 次覆盖保存、_xxxx每 1000 次保存快照 - 同一份 README 也提醒:原版 pjreddie 仓库在 iterations > 1000 后只每 10000 次保存一次,所以你可能训练很久也只看到很少快照
✅快速判断方法:看你仓库 README 是否包含这句说明(每100/1000保存)。如果没有,很可能不是 AlexeyAB。
A3. 检查.data文件里的backup=是否指向你看的那个目录
AlexeyAB README 对obj.data的标准格式写得很清楚,其中backup = backup/决定权重保存目录
在 Windows 下最容易踩的坑:
- 你运行
darknet.exe的工作目录不同,backup/是相对路径,可能保存到你没看的地方 - 建议改成绝对路径(例如
backup = D:/YOLO/darknet-master/build/darknet/x64/backup/)
✅只要你把
backup=写成绝对路径,90%“找不到 weights”的问题都能秒解 🙂
🔵方案 B:你想“生成更多权重快照”,就调小保存间隔(可控、最符合你需求)
你现在的诉求是:不想只看到一个 last,而是想定期留下多个 checkpoints(比如每 200 次、500 次都存一个)。
有两条路:
B1(推荐):直接用 AlexeyAB 版(天然有 100/1000 保存策略)
如果你不是 AlexeyAB,建议直接换 AlexeyAB(Windows 支持最好,训练/保存逻辑也更完善)。README 已明确保存策略:每 100 次覆盖 last、每 1000 次保存一个_xxxx.weights
B2(进阶):改源码src/detector.c自定义保存频率(你提到 C 语言,这个很适合)
很多人就是通过修改detector.c里保存权重的if (i % N == 0)来改变保存间隔(比如从 10000 改 1000)。有文章给出了具体修改点与示例逻辑(修改保存条件)
你可以按这个思路做(核心点):
*_last.weights:频繁保存但覆盖(比如 100 次)*_i.weights:按你想要的间隔保存快照(比如 500 或 1000 次)
⚠️注意:改完要重新编译darknet.exe,否则不会生效。
🟡方案 C:其实你已经“保存很多次”了,只是 Windows 资源管理器看起来像“只有一个”
这个属于“认知误差”但很常见:
yolov3-voc_last.weights这个文件名固定,每 100 iterations 会覆盖式写入(你训练两天,它可能已经写了上千次,但文件名还是那一个)你可以用这个方法验证它确实在不断更新:
- 打开文件属性,看“修改时间”是否一直在变
- 或者用
dir /T:W看写入时间是否刷新
✅如果你只是想“随时能中断训练并恢复”,一个不断更新的
last.weights其实是最实用的文件(它就是断点续训的最佳入口)。
🔴方案 D:训练太慢导致两天迭代都没到 1000(最容易被忽略,但概率很高)
如果你在 Windows 下没启用 GPU/CUDA,Darknet 训练会非常慢;两天可能才跑几百 iterations,于是你自然看不到_1000.weights快照。
你可以用这几个特征判断:
- 控制台每个 iteration 时间是否是几秒~几十秒
- GPU 是否有占用(
nvidia-smi看显存/利用率) - 编译时是否打开了
GPU=1 CUDNN=1等选项(AlexeyAB 的 Windows 编译路线里通常需要 CUDA/cuDNN 配好)
如果确实是 CPU 在跑:
✅建议优先把 GPU 打通(速度通常能提升一个数量级),这样你很快就能到 1000/2000/… 产生快照。
✅️问题延伸
1)last.weights、_xxxx.weights、final.weights各有什么意义?
以 AlexeyAB 版为例(官方 README 写得非常清楚):
*_last.weights:每 100 iterations 保存一次,覆盖更新,用于断点续训最方便*_xxxx.weights:每 1000 iterations 保存一次,保留历史快照,用于挑最好 mAP 的模型*_final.weights:训练结束后生成最终权重
所以你现在只看到last并不代表“只保存了一次”,而是“只保留了一份覆盖文件”。
2)为什么很多教程说“原版只有每 10000 才保存一次”?
因为 pjreddie 原版的保存策略更保守:iterations > 1000 后才开始每 10000 保存一次,因此快照很少。AlexeyAB README 也明确对比了这一点
✅️问题预测(你接下来可能会遇到的坑)
你改了
backup=但仍找不到文件
因为你运行目录不对/路径写错/末尾斜杠格式问题。建议直接用绝对路径并确保目录存在。磁盘写入失败但你没注意到
控制台通常会提示保存失败或权限问题。建议训练时留意 “Saving weights to …” 是否出现。训练中途断电/程序崩溃
只要last.weights在,你就能从它继续训练:darknet.exe detector train ... backup\yolov3-voc_last.weights
✅️小结
你“训练两天只生成一个权重文件”大概率是正常现象:
*_last.weights会按固定周期保存但覆盖写入,所以你永远只看到一个文件名如果你想看到多个快照:
- 确保你用的是 AlexeyAB(每 1000 次会生成
_xxxx.weights) - 或修改
detector.c保存间隔(你提到 C 语言,这条路很适合)
- 确保你用的是 AlexeyAB(每 1000 次会生成
如果两天还没有
_1000.weights:很可能是迭代数还没到 1000(尤其 CPU 训练)→ 优先检查当前 iteration 并考虑启用 GPU。
🌹 结语 & 互动说明
希望以上分析与解决思路,能为你当前的问题提供一些有效线索或直接可用的操作路径。
若你按文中步骤执行后仍未解决:
- 不必焦虑或抱怨,这很常见——复杂问题往往由多重因素叠加引起;
- 欢迎你将最新报错信息、关键代码片段、环境说明等补充到评论区;
- 我会在力所能及的范围内,结合大家的反馈一起帮你继续定位 👀
💡如果你有更优或更通用的解法:
- 非常欢迎在评论区分享你的实践经验或改进方案;
- 你的这份补充,可能正好帮到更多正在被类似问题困扰的同学;
- 正所谓「赠人玫瑰,手有余香」,也算是为技术社区持续注入正向循环
🧧 文末福利:技术成长加速包 🧧
文中部分问题来自本人项目实践,部分来自读者反馈与公开社区案例,也有少量经由全网社区与智能问答平台整理而来。
若你尝试后仍没完全解决问题,还请多一点理解、少一点苛责——技术问题本就复杂多变,没有任何人能给出对所有场景都 100% 套用的方案。
如果你已经找到更适合自己项目现场的做法,非常建议你沉淀成文档或教程,这不仅是对他人的帮助,更是对自己认知的再升级。
如果你还在持续查 Bug、找方案,可以顺便逛逛我专门整理的 Bug 专栏:《全栈 Bug 调优(实战版)》。
这里收录的都是在真实场景中踩过的坑,希望能帮你少走弯路,节省更多宝贵时间。
✍️如果这篇文章对你有一点点帮助:
- 欢迎给 bug菌 来个一键三连:关注 + 点赞 + 收藏
- 你的支持,是我持续输出高质量实战内容的最大动力。
同时也欢迎关注我的硬核公众号 「猿圈奇妙屋」:
获取第一时间更新的技术干货、BAT 等互联网公司最新面试真题、4000G+ 技术 PDF 电子书、简历 / PPT 模板、技术文章 Markdown 模板等资料,统统免费领取。
你能想到的绝大部分学习资料,我都尽量帮你准备齐全,剩下的只需要你愿意迈出那一步来拿。
🫵 Who am I?
我是 bug菌:
- 热活跃于 CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等技术社区;
- CSDN 博客之星 Top30、华为云多年度十佳博主/卓越贡献者、掘金多年度人气作者 Top40;
- 掘金、InfoQ、51CTO 等平台签约及优质作者;
- 全网粉丝累计30w+。
更多高质量技术内容及成长资料,可查看这个合集入口 👉 点击查看 👈️
硬核技术公众号「猿圈奇妙屋」期待你的加入,一起进阶、一起打怪升级。
- End -