"ST不是已经有Model Zoo了吗?直接拿现成模型用不就行了?"——这是我在ST中文社区和线下嵌入式交流会上,最近几个月被问得最多的一句话。
问的人有做工业设备的、有做消费电子的,也有刚转嵌入式AI的学生。他们的逻辑都一样:反正ST(意法半导体)官方把预训练模型都做好了,我们这些搞应用的人何必再从零折腾网络结构、训练、量化这一大堆事?
这个逻辑有没有道理?有,但只有一半。另一半,等你真正把一个模型装进你的产品、面对真实客户数据的时候,才会慢慢明白。这篇文章我打算把这件事彻底聊透:ST的Model Zoo到底提供了什么,什么样的项目可以直接用它,什么样的项目必须自己设计模型,以及夹在两者之间的迁移学习怎么做。我会结合自己做嵌入式AI项目的实际经历来写,有些坑该踩的我都替你踩过了。
1. 先把话说清楚:ST 的 Model Zoo 到底给了我们什么
1.1 名字容易搞混的三件套
先说个前置知识,很多人把ST在嵌入式AI上的东西混成一谈,其实有三样。
- STM32Cube.AI:这是一个工具/插件,负责把你的模型转换成能在STM32上跑的C代码。你训练好的Keras、TFLite或ONNX模型,经过它一转换,就变成可以在MCU上做推理的库函数。
- STM32 Model Zoo:这是一个GitHub仓库,里面是一堆针对STM32优化好的预训练模型,附带完整的部署配置、在官方开发板上的性能基准。这是"模型从哪来"的部分。
- NanoEdge AI Studio:这是一个自动化建模工具,你喂给它正常/异常数据,它自动帮你搜索并生成一个合适的轻量模型。它不给你现成模型,而是帮你从数据里"设计"模型。
很多人问"用Model Zoo是不是就不用碰Cube.AI了",完全是误会。Model Zoo只是把训练好的模型和参考部署脚本给了你,真正要塞进STM32,仍然要过一遍Cube.AI转换。你可以把Model Zoo理解为"菜谱和半成品食材",Cube.AI是"你的锅和灶"。
顺便说一句,ST这个词在不同语境里含义很多。做算法竞赛的朋友可能会想到ST表(Sparse Table),写C++的朋友可能搜到过"std::reverse"被手滑打成了"st d reverse"——但在嵌入式圈子里,ST就是指意法半导体。
1.2 我实际翻了一遍仓库,里面真正能用的东西
去GitHub上把STM32 Model Zoo翻过一遍,大致是这么几类:
| 模型类型 | 常见结构 | 典型用途 |
|---|---|---|
| 图像分类 | MobileNet v1/v2/v3、ResNet变体 | 目标类别识别、物料分类 |
| 目标检测 | YOLO变体、SSD等 | 人/车/物品检测、流量统计 |
| 音频/关键词识别 | 小型CNN、KWS模型 | 语音唤醒词、简单声音识别 |
| 姿态估计 | 关键点检测网络 | 人体姿态、动作识别(部分版本有) |
每个模型不是光秃秃一个权重文件那么简单,通常还带着:
- 训练代码和数据集说明;
- 已经做好的INT8量化版本(这个对MCU很关键);
- 在ST官方开发板上实测过的性能表(推理帧率、Flash占用、RAM占用);
- CubeMX和Cube.AI的参考配置工程。
也就是说,官方替你做了不少"脏活":选结构、训练、量化、验证、跑基准。你只要照着文档把它导入工程,就能在开发板上看到效果。对想做快速验证的人来说,这个过程相当友好。
1.3 一个残酷事实:模型库里的模型都是"参考设计"
但我必须把话说直白:Model Zoo的定位是"参考设计",不是"产品方案"。
它的目的是向你展示"这块芯片配合这套工具链,AI能力能做到什么程度",帮你评估平台、设定预期、快速跑通端到端流程。它不等于"你的产品可以直接拿它来推理"。
原因也很简单:这些模型都是在公开数据集上训练的。ImageNet里有猫、狗、汽车、飞机,有工人、办公室、街道,但它没有你车间里那台设备在特定光照下的表面划痕,没有你客户那边配电柜里轴承缺油的那种异响,也没有你们公司产品装配线上那种只有3毫米的瑕疵。
用宜家样板间来类比最合适:你去样板间看一圈,知道了这个户型能装成什么样、需要多少预算,但你不可能直接把样板间整个搬回家住。你得按自己的房型、生活动线、收纳习惯重新改。
2. 为什么"直接用现成模型"这个诱惑这么难拒绝
2.1 它确实解决了嵌入式AI最脏最累的活
这几年整个AI行业聊得最多的是开源模型的质变,动辄百亿参数、可以在消费级设备上跑的大模型层出不穷。但我要先泼一盆冷水:那是云计算和桌面端的逻辑,和MCU上跑AI是两条完全不同的赛道。ST Model Zoo里的模型哪怕最大的,也就几MB,跟"大模型"这个词不在一个量级上。但正因为这样,"直接用现成模型"这句话在小模型世界里反而更有诱惑力——因为它的确省事。
我从来不反对先用现成模型。实际上我自己的项目流程里,第一步永远是"找一个现成模型先把端到端跑通"。理由很实在:
- 省数据:对多数中小团队来说,采集、清洗、标注数据是最大的成本。现成模型至少能让你在拿到数据之前就把流程走通。
- 省训练:训练一个像样的网络,哪怕在GPU上也要几小时到几天,还要盯着loss曲线、做过拟合处理。用现成模型这段全免。
- 省优化:MCU上部署最难的不是训练,而是后续的量化、裁剪、算子适配。官方模型已经把量化版本和部署工程做好了。
- 省评估:官方给出了性能基准,你在做方案论证的时候可以直接用这些数字估时间、估成本,不用等板子到手才知道行不行。
所以如果你是做预研、做Demo、做竞标演示,或者在评估"这个MCU能不能扛起这个AI任务",Model Zoo是效率最高的起点。我自己做可行性评估的时候,基本就是先拿官方模型跑一遍,用数据说话。
2.2 "免费午餐"的边界在哪里
免费的部分是通用的特征提取能力。一个在ImageNet上训练过的网络,它前几层已经学会了如何识别边缘、纹理、形状、色彩渐变,这些能力对所有图像任务都有价值。不免费的部分是"对你的场景做最终判断"的能力。深层的分类边界是完全面向原数据集的——它把猫和狗分得很清楚,不代表它也分得清"合格焊点"和"虚焊焊点"。
所以"直接用官方模型"真正成立的条件,是下面几项同时满足:
- 你的目标类别在模型训练数据集中很常见(人、车辆、宠物、常见物体);
- 你的输入数据形态和训练数据接近(普通可见光图像、常见音频采样率);
- 你的精度要求不是极致(有个八、九成能用就行);
- 你主要做演示、验证或内部工具,不出货给最终客户。
这几条都满足,直接用就是最优解。但做产品的人心里都清楚,这几条往往同时不满足。
2.3 从实际项目看:什么时候官方模型一装就灵
举两个真实例子。
有一回我们做一个展厅的人流统计方案,用的是官方目标检测模型(类似YOLO的轻量变体),跑在STM32H7上。效果出乎意料地好——因为"人"这个类别在COCO数据集里是最大类的存在,模型见过的行人姿态、穿着、角度都非常多。从Demo到小批量部署,基本没有返工。
另一个例子是门禁场景的口罩识别。公开数据集中口罩类别非常充足,官方模型稍微一微调就能用。这种场景,你确实没必要自己设计什么新网络结构。
这两个例子的共同点是:目标类别被大规模公开数据集覆盖,环境相对固定,输入质量可控。碰到这种情况,老老实实去用现成模型,省下来的时间可以做更有价值的事。
3. 哪些场景下,官方模型库会尴尬到你必须自己动手
3.1 数据分布错位:这是绝大多数翻车现场的总根源
先说清楚一个问题:模型训练和实际推理之间有一个"数据分布"的概念,通俗讲就是"模型见过的东西"和"你让它看的东西"是不是一类。
Model Zoo里的模型见过ImageNet,没见过你的产线。这种错位在工业场景里几乎是必然的:表面缺陷检测(划痕、脏污、色差、压伤)、特定物体识别(某种型号的汽车零件、某种茶叶的包装缺陷)、特定声音识别(泵的异响、轴承故障),这些目标类别在公开数据集里要么完全没有,要么少到可以忽略。
我朋友做过一个项目,识别普洱茶饼的包装缺陷。"好茶饼"和"有凹陷的茶饼"的差异极其细微,而且判断标准是他们工厂自己的质检规范。这种任务,拿什么现成模型都没用,因为全世界只有他们手里那几千张图包含了这个知识。这种情况只能走"自己采集数据+自己设计/微调模型"这条路。
3.2 任务类型覆盖不到:分类检测之外的需求怎么办
Model Zoo的模型以图像分类、目标检测、语音关键词识别为主。但嵌入式AI的很多需求根本不在这个范围内:
- 回归任务:预测电池剩余电量、预测电机负载、估算振动量的变化趋势。分类模型干不了这个,你需要的是一个输出连续值的回归模型。我见过不少团队直接用LightGBM这类传统机器学习模型做回归,效果比硬套神经网络好得多,模型也小得多。
- 异常检测:很多设备只有正常数据,异常样本非常稀有。你没法训练一个"没见过异常"的分类器。经典的思路是做重构误差检测或单类分类,Model Zoo里没有这种现成货。
- 时序分类:基于滑动窗口的振动波形、电流波形分析。这需要一维卷积或TCN结构,而Model Zoo主要是二维视觉模型。你至少要在数据处理和网络结构上做大量改造。
- 图像分割:如果需要给图片逐像素分类(比如焊缝区域的像素级分割),Model Zoo基本没有直接能用的模型;UNet那类结构往往要自己搭、自己训。
说白了,官方模型库只是在几个常见任务方向上准备了参考实现。你的任务稍微偏一点,整条链路就要自己来。
3.3 资源约束比官方基准更极端:MCU不是开发板
官方性能基准跑在ST自家的评估板上,用的通常是H7、F4这类中高端芯片,Flash和RAM给得非常宽裕。而实际产品里的MCU可能只是G0、L0这类小资源型号,而且Flash/RAM还要同时分给RTOS、通信协议栈、文件系统、UI,留给AI的可能只有几十KB。
这时候你会碰到一个很现实的问题:官方模型对你而言依旧太大。要么加大量化力度,要么缩小输入分辨率,要么削减通道数,要么换更小的结构。而这些动作,几乎每一步都意味着你要重新训练或至少做微调,已经不是"直接拿来用"了。
我在这些项目里经常想起深度学习圈子里说的"低显存运行模型"——本质都是在有限资源里抠空间,只是MCU上抠的是Flash和RAM,比显存抠得更狠。你在抠的时候,官方模型"超配"的问题就变得很刺眼。
3.4 公开模型的安全隐患:模型中毒不是危言耸听
还有一个容易被忽略的点:公开模型库有安全风险。学术界这些年反复讨论过模型中毒(backdoor attack / poisoning attack)——攻击者可以向训练数据或预训练模型里植入触发器,让模型在特定条件下产生错误输出。
在Demo、玩具、内部工具里这无所谓。但如果你做的是工业控制、安防、医疗辅助这类对可靠性要求高的产品,直接拿一个来源不明的预训练模型就上线,数据链路完全不可控,这本身就是风险。至少你应该自己重训或者微调一遍,确保模型的行为你心里有数。
注意我不是让大家因噎废食——Model Zoo毕竟是官方渠道,可信度比第三方网盘资源高得多。但"官方发布"不等于"免疫一切风险",有条件的话,模型版本管理、验证集测试这些流程该上还是得上。
4. 自己设计模型的完整工作流:从约束到板端验证
如果前面的分析让你决定自己动手,那接下来的问题是:怎么做才靠谱?我按自己踩过坑之后沉淀下来的流程写一遍。
4.1 先算清楚预算:Flash、RAM、时延、功耗四本账
自己设计模型的第一步不是画网络结构,而是算账。目标芯片的资源是有限的,你得先知道预算再设计模型。
- Flash预算:模型权重以INT8存储时,每1万参数约占10KB Flash。一个50万参数的模型,权重就占500KB。还要加上代码体积和运行时库。
- RAM预算:推理时的中间激活值往往比权重更占内存。输入输出的张量、每一层的特征图、以及临时缓冲,峰值可能比权重还高。
- 时延预算:粗略估算时可以用"每百万乘加运算需要多少毫秒"来框算,具体数值要等板端实测。关键是先定一个可接受的上限,比如100ms。
- 功耗预算:一次推理耗电多少,取决于推理时间和平均电流。如果产品用电池供电,每天推理次数和单次功耗决定了电池寿命。
我自己的习惯是第一版模型在总预算上留50%的余量。因为后面大概率要加功能、加算子、加数据缓存,预算全占满的话,任何一个改动都可能把工程逼进死胡同。
4.2 数据是最难的一关:嵌入式场景的数据为何稀缺
自己设计模型的另一大难关是数据。产品还没量产,传感器还没铺出去,现场数据根本不存在;就算有样机,采集回来的原始信号也充满噪声、缺标签、时序不齐。
我的经验是:
- 搭建一个最小数据采集系统,尽量在真实工况下采集,不要偷懒用仿真数据冒充。仿真数据和真实数据的差异,会在模型部署后报复你。
- 用滑动窗口把长序列切成固定长度样本。切窗长度既要有物理意义(比如一个完整的机械旋转周期的振动),也要匹配模型输入要求。窗口之间加一点重叠,相当于免费扩增数据。
- 数据增强要"物理正确"。图像加噪声、亮度扰动没问题;时间序列做幅度缩放、轻微时间扭曲没问题;但把图像随便旋转90度对工业缺陷检测可能就是灾难,因为你实际根本不关心倒着的缺陷。
另外,标注成本高时别硬着头皮攒大几千张数据。优先走"少量数据+迁移学习"路线,后面第5章会细讲。
4.3 结构选型:轻量网络的三个方向
自己设计模型不等于发明新网络。绝大多数情况下,你是在已经有理论验证的结构里做裁剪和变体。
- 轻量CNN:以深度可分离卷积为主的MobileNet系列,适合图像任务。它用"先深度卷积再逐点卷积"的方式把计算量降了一个数量级,是MCU上最常用的视觉骨干。
- 一维时序模型:TCN、时序卷积网络适合振动、电流、声音波形。它们在实现上就是一维卷积,Cube.AI支持很好。RNN/LSTM在MCU上部署不友好,循环展开容易把时延和内存顶爆。
- 传统机器学习模型:LightGBM、随机森林等结构化模型,适合从信号里手工提特征再建模。很多MCU上跑这类推理比神经网络还快。如果任务能回归、能做成结构化输入,别不好意思用传统方法。
还有一句话我必须说:别被Transformer的热潮带偏。云端跑大模型和MCU跑轻量网络是两条完全不同的赛道。在几十KB内存的芯片上做时序建模,一维卷积大概率比一个注意力变体稳定得多。你要是真的对序列依赖有硬需求,先去看看有没有成熟的线性复杂度变体,不要直接照搬标准Transformer。
4.4 训练与量化:为什么我坚持用 QAT 而不是 PTQ
模型训练完之后,部署到MCU上几乎必然要转成INT8。这里有一个关键选择:训练后量化(PTQ)还是量化感知训练(QAT)。
| 对比项 | PTQ(训练后量化) | QAT(量化感知训练) |
|---|---|---|
| 做法 | 模型训完后直接用校准集统计量化参数 | 训练过程中模拟量化误差,让权重适应离散值 |
| 精度损失 | 小模型上掉点明显,可能超过3-5% | 通常控制在1%以内 |
| 实现难度 | 简单,不需要改训练代码 | 需要训练代码,要插入伪量化节点 |
| 适用情况 | 模型有冗余、时间紧、快速验证 | 模型很小、精度敏感、正式产品 |
我的经验是:MCU上跑的模型本来就不大,冗余很有限,PTQ掉点经常掉到不能接受;QAT虽然麻烦,但在小模型上是值得的。这也是为什么从Model Zoo里拿现成模型有时反而尴尬——它给了你量化好的权重,但没给你完整的QAT训练脚本,你想重训还得自己复原整个训练流程。这时候"要不要自己设计模型"就有了另一个层面的答案:设计一个自己能完全掌控训练流程的模型,部署阶段会顺手很多。
4.5 部署:Cube.AI 转换时的算子兼容检查
模型训练好之后,用STM32Cube.AI转成C代码。这个环节最常翻车的不是转换本身,而是算子兼容性:
- 不是所有PyTorch/Keras算子都支持。自定义层、动态控制流、某些高级激活函数,可能在Cube.AI的算子支持列表之外。
- ONNX中间格式的算子版本不匹配,也是常见问题。尽量用Cube.AI文档里推荐的训练框架和版本。
- 预处理尽量放在模型外面做,用C语言实现,别把resize、归一化这些操作塞进模型里当算子——转换麻烦,运行也慢。
命令行转换大概是这个风格(示意):
stm32ai generate -m my_model.tflite \ --name my_model \ --output ./stm32ai_output \ --type tflite转换完成后会生成一个性能报告,里面包含各层的Flash/RAM占用和推理周期估算。这个报告要留着,后面板端实测要拿它对照。
4.6 板端验证:别只盯着准确率
模型在PC上准确率再高,都不算数。上板之后你要测的是这几样:
- 推理时间:用GPIO翻转或硬件定时器测单次推理时间,跑几十次取平均,比Cube.AI报告里的估算更可信。
- 内存峰值:Cube.AI报告会给出静态RAM占用,但动态缓冲和系统其他模块的占用要靠实际链接后确认。链接报错超RAM是家常便饭。
- 真机数据:用现场采集的、模型没见过的一段数据流去测,别用训练集或验证集糊弄自己。这一步能暴露光照变化、噪声、传感器漂移造成的真实表现。
- 功耗:用电流探头实测平均电流和峰值电流,结合推理频率算连续工作功耗。
我还会为每个版本建一张"模型卡":记下模型结构、参数量、训练数据版本、量化方式、验证精度、实测时延、Flash/RAM占用。没有这张卡,迭代三个版本之后你就会彻底记不清哪个版本对应哪次实验。
5. 更聪明的折中:在官方模型上做迁移学习
5.1 迁移学习为什么在这里特别合适
自己设计模型听着爽,但成本和风险也高。实际上,大部分项目有一个比"从零设计"聪明得多的中间路线:迁移学习。
还记得前面说的吗?预训练模型的前几层是通用的特征提取器。所以完全没必要从随机初始化开始训练。把官方模型当作"学会了看世界的基础功"的人,你只需要教会它"你们车间里什么样的焊点算合格"。这比从零训练省数据、省时间,比直接用现成模型贴合你的私有数据。
我在做迁移学习时有个类比:官方模型像一位已经认识一万种物体的实习生,你对他的要求只是"再认识一下你们公司的三百种产品缺陷"。教一个懂行的人学新东西,总比教一个婴儿从零认识世界快得多。
5.2 实操:加载官方模型、冻结主干、换分类头
以Keras/TFLite为例,思路是这样的(代码示意,具体层名以实际模型为准):
import tensorflow as tf # 加载ST Model Zoo里的预训练模型 base_model = tf.keras.models.load_model("st_mobilenetv2_quant.h5") # 冻结骨干网络,先不更新权重 base_model.trainable = False # 找到倒数第二个特征层,接上新的分类头 feature = base_model.get_layer("global_average_pooling2d").output x = tf.keras.layers.Dense(128, activation="relu")(feature) x = tf.keras.layers.Dropout(0.3)(x) out = tf.keras.layers.Dense(num_classes, activation="softmax")(x) model = tf.keras.Model(inputs=base_model.input, outputs=out) model.compile(optimizer=tf.keras.optimizers.Adam(1e-3), loss="categorical_crossentropy", metrics=["accuracy"])关键点在于:先把骨干冻结住,只训练新加的分类头,让随机初始化的那几层先学会用已有的特征。第一轮跑通之后,再解冻后面一部分层(比如最后两三个卷积块),用很小的学习率(1e-4甚至更低)做一轮微调。这个"先冻结后解冻"的顺序能避免随机初始化的分类头在刚开始就把骨干网络的梯度带偏。
5.3 只有几百张图时怎么微调才不翻车
现实痛点往往是数据少。少到只有几百张标注图怎么办?
- 根基在预训练特征:数据越少,越不要训练太深的层。很多时候只训练分类头就足够,连解冻微调都可以不做。
- 增强要做够:图像加噪声、翻转、裁剪、亮度扰动都要上。但要注意"物理正确",工业场景别做无意义的旋转。
- 学习率一定要小:1e-3到1e-4这个量级是安全的。用大学习率微调预训练模型,几轮就会把之前学好的特征破坏掉。
- 盯紧验证集:如果训练精度一直涨而验证精度开始掉,说明模型在死记硬背训练集,赶紧Early stopping。
这里还有个很实用的小技巧:你可以把预训练模型当成一个特征提取器,把每张图过一遍网络,取出中间层的特征向量,然后用SVM这类经典方法在这个特征向量上做分类。很多情况下,这个"特征+线性分类器"路线比端到端微调更稳,尤其数据量极小的时候。这跟深度学习圈里Embedding模型的用法是同一个道理——先拿通用表示,再学一个轻量头的决策边界。
5.4 一个真实案例:从通用模型到产品模型的转身
我亲手做过一个声音异响识别的项目。设备是一台小型旋转机械,要识别的是"轴承缺油后的异响"。最开始图省事,直接部署了ST Model Zoo里的音频分类模型,效果惨不忍睹——不是因为模型差,而是因为它的训练数据里根本没有"轴承缺油"这种声音,它连"正常运转"和"异常异响"的分类边界都没法建立。
后来我们做的正是迁移学习:保留官方模型的滤波器组和浅层特征提取部分(它们对声音频段的分解能力是通用的),把后面的分类部分整个换掉,用自己的两百多段正常/异常录音做微调。其中正常声音来自现场样机,异常声音来自人为设置故障的样机(让轴承缺油、加大负载、改变转速)。微调之后的模型,在独立测试集上的召回率从最初的50%出头提到了93%左右。
整个过程我没有"从零设计网络结构",但最终模型的实际形态已经和官方版本差别很大——新的分类层、更小的输入尺寸、重新量化过的权重。这就是我为什么坚持说:这个问题的答案不是"用官方"或"不用官方"二选一,而是"以官方模型为起点,把它改造成你的模型"。
6. 我的最终决策策略:一张表和一个朴素建议
6.1 场景决策表
把前面所有分析浓缩成一张表,给正在纠结的人直接对号入座:
| 你的需求 | 推荐路线 | 理由 |
|---|---|---|
| 预研Demo/可行性验证 | 直接用Model Zoo | 省时省力,快速给出结论 |
| 通用类别(人、车、常见物体)识别 | 直接用Model Zoo | 公开数据集已覆盖,掉点有限 |
| 私有目标/特定缺陷/私有声音 | 基于官方模型迁移学习 | 省数据,贴合场景,风险可控 |
| 回归/异常检测/时序分类等非覆盖任务 | 自己设计模型或传统ML | 现成模型不具备对应能力 |
| 内存极度紧张(几十KB级别) | 自己设计极简模型 | 官方模型超出预算 |
| 高可靠/安全敏感场景 | 自己重训或严格验证 | 数据链路可控,降低模型投毒风险 |
6.2 我在这个选择上栽过的跟头
说个我自己的反面教材。早年间做产品,为了赶交付,直接拿一个当时很流行的开源检测模型部署到了设备里。在办公室测试时一切正常,准确率报表亮眼,客户验收也通过了。结果设备到了客户现场,开始疯狂误报。问题出在哪里?客户的厂房是低照度环境,相机视角是俯视45度,背景里有大量和检测目标颜色相近的管道。办公室测试数据里完全没有这些变化。模型在实验室的分布里是好的,到了真实分布里就直接失灵。
后来我养成了一个习惯,也是我要分享给所有做嵌入式AI的同行的习惯:无论用现成模型还是自己设计模型,第一步永远是"用你自己场景里的少量真实数据跑一遍看看"。这一步成本很低,可能半天就够,但它能直接告诉你这个模型在你的世界里活不活得下去。很多灾难,往往就是从跳过这一步开始的。
6.3 给新入坑者的一个朴素建议
关于"ST已经有Model Zoo了,我们还需要自己设计模型吗",我的答案已经很清楚:大概率不是"从零设计一个全新网络",但也不是"原封不动地用官方模型"。多数项目的正解,是把官方模型当成一个高质量的起点,做一定程度的迁移学习和裁剪,让它真正变成自己的模型。哪怕你最后全改了,当初那个官方模型也帮你证明了"这条路走得通"。
最后分享一个小习惯:从我第一次做嵌入式AI开始,就坚持给每个项目建一个"模型实验记录"文档,记录模型版本、数据集版本、量化方式、验证精度、实测时延和资源占用。刚开始觉得麻烦,但迭代过几轮之后,你会发现它救过你很多次——你永远不会在三个月后看着一段代码想不起来"这个模型用的是哪批数据训的"。这个习惯建议你也趁早养成,不管最后你选择用Model Zoo还是自己设计,都用得上。