本文分享了关于如何高效管理代码实验的方法,包括使用Yaml文件配置训练参数、代码模块化、使用Tensorboard和tqdm库、利用Github记录代码和实验结果等。这些方法可以帮助研究人员更高效地训练和测试模型,提高项目落地的成功率。
通过Yaml文件来管理模型和训练相关的参数,包括预处理、分类种类、backbone参数、优化器和损失函数的选择等。这样可以方便地断点训练、fine-tune或直接测试,并且能方便地查看结果和对应的参数。
将代码模块化可以提高代码的可维护性和可重用性,减少修改代码时的影响范围。深度学习代码可以分为I/O模块、预处理模块、可视化模块、模型主体等模块。
Tensorboard可以追踪训练的loss曲线变化,方便判断模型是否收敛或是否overfit。tqdm可以直观地跟踪训练进度,方便做early stop。
使用Github记录代码和实验结果可以方便地管理项目,多人合作开发或单独项目均可。可以使用excel记录实验结果,包括模型对应的yaml路径、训练轮数和测试结果等。
点击上方“
计算机视觉工坊
”,选择“星标”
干货第一时间送达
内容来自知乎,「计算机视觉工坊」整理,如有侵权请联系删除
https://www.zhihu.com/question/269707221
作者:叶小飞
我之前在北美奔驰落地时,曾有段时间为了测试不同的结构和参数,一周能训练一百来个不同的模型,为此我结合公司前辈们的做法和自己的一点思考总结了一套高效的代码实验管理方法,成功帮助了项目落地, 现在在这里分享给大家。
使用Yaml文件来配置训练参数
我知道很多开源repo喜欢用input argparse来传输一大堆训练和模型相关的参数,其实非常不高效。一方面,你每次训练都需要手动输入大量参数会很麻烦,如果直接改默认值又要跑到代码里去改,会浪费很多时间。这里我推荐大家直接使用一个Yaml file来控制所有模型和训练相关的参数,并将该yaml的命名与模型名字和时间戳联系起来,著名的3d点云检测库OpenPCDet就是这么做的,如下方这个链接所示:https://github.com/open-mmlab/OpenPCDet/blob/master/tools/cfgs/kitti_models/pointrcnn.yaml
我从上方给的链接截了该yaml文件部分内容,如下图所示,这个配置文件涵盖了如何预处理点云,classification的种类,还有backbone各方面的参数、optimzer和loss的选择(图中未展示,完整请看上方链接)。也就是说,基本所有能影响你模型的因素,都被涵括在了这个文件里,而在代码中,你只需要用一个简单的 yaml.load()就能把这些参数全部读到一个dict里。更关键的是,
这个配置文件可以随着你的checkpoint一起被存到相同的文件夹,方便你直接拿来做断点训练、finetune或者直接做测试,用来做测试时你也可以很方便把结果和对应的参数对上。
代码模块化非常重要
有些研究人员写代码时喜欢把整个系统写的过于耦合,比如把loss function和模型写到一起,这就会经常导致牵一发而动全身,你改动某一小块就会导致后面的接口也全变,所以代码模块化做的好,可以节省你许多时间。一般的深度学习代码基本可以分为这么几大块(以pytorch为例):I/O模块、预处理模块、可视化模块、模型主体(如果一个大模型包含子模型则应该另起class)、损失函数、后处理,并在训练或者测试脚本里串联起来。代码模块化的另一好处,就是方便你在yaml里去定义不同方面的参数,便于阅览。另外很多成熟代码里都会用到importlib神库,
它可以允许你不把训练时用哪个模型或者哪个子模型在代码里定死,而是可以直接在yaml里定义。