Kaggle GrandMaster在训练完模型后还会做什么?
原作者:Vladimir I. Iglovikov,翻译已获得原作者授权,原文链接。
Vladimir I. Iglovikov, Lyft 的计算机视觉工程师,主要研究自动驾驶。曾服役于俄罗斯空降部队。UC Davis 获得过理论凝聚态物理学博士的学位。Kaggler(Grandmaster),曾获得过 Carvana 图像遮蔽挑战的冠军,以及 Dstl 卫星图像特征检测挑战的第三名。
我参加kaggle和其他机器学习平台的竞赛来增加我对机器学习的理解,我的kaggle排名是全球第19名,拿到了Kaggle Grandmaster头衔
每项机器学习项目都以新知识,新代码和新模型权重结束。
我喜欢新的知识,但忽略了旧的项目流水线可以带来的价值。代码保留在Github私有仓库中。模型权重遗落在硬盘,最后都被清理掉。
这个情况并不是kaggle 独有的。在学术界也发生着一模一样的事,学生训练模型,写论文。论文被学术会议接收后,流水线就抛弃,训练artifacts被删除然后学生继续做下一个。
这篇文章将会讨论每次机器学习挑战结束后,你可以尝试的几个小步骤。
这些步骤将:
- 增强技术知识
- 建立个人品牌
- 改善职业机会
- 让世界更美好:)
我将用这个Github仓库示范
https://github.com/ternaus/retinaface
这些步骤不是kaggle 挑战的一部分,而是来讲清楚这个项目在干什么。
I: +5 min: 把代码发布到Github公共仓库
大部分情况是代码在github上,但是是私有仓库。
如果将其公开,我们又会损失什么呢?
在某些情况下,私有仓库确实应该保证私有,但是在你的试验项目,你的kaggle解决方案,或者你的论文中,不应该是这样的。
我见过的最完美的理由是:人们认为所有公共代码都应该是完美的,如果不是的话他们可能会遭受非议。
但事实上,没有人在意的。只管做你的,照原样发布,不需要任何润色。
公开代码是心理上很重要的一步。发布不完美的代码是一种自信,大胆的行动。
此外,所有后续步骤都基于公开代码。
示例:https://github.com/ternaus/retinaface
II: +20 min: 增加可读性
你可以通过添加语法格式化工具和检查器来提高python代码的可读性。
这并不困难并且也不费时,检查器和格式化工具并不会把糟糕的代码变成优秀的,但是可读性会提高。考虑将语法规范当成个人习惯,就像喝水吃饭一样。
我有一篇文章叫9步让你拥有更专业的python代码。大家有兴趣可以看看。
第一步: 配置文件
将这些文件加到你仓库的根目录
- setup.cfg - flake8 和 mypy的配置
- pyproject.toml – black的配置
第二步: 需求环境
使用下面的命令安装所需的库
pip install black flake8 mypy
第三步: black
有100500种格式化代码的方法,像black或yapf之类的格式化工具会修改代码来满足一组预先定义好的规则
阅读具有某些标准的代码库会容易很多。当我们花几个小时来编写代码并在不同代码风格之间切换,我们的“意志力”会被吸干。所以没有充分原因就不需要这样做。
运行
black .
将会重新格式化所有代码文件以遵循black的规则
第四步: flake8
运行
flake8
不会修改代码,但是会检查代码中的语法问题并输出到屏幕。
然后去改正他们。
第五步: mypy
Python并没有强制性的静态类型化,但是建议将类型添加到函数中并返回类型。
例如:
class MyModel(nn.Module):
....
def forward(x: torch.Tensor) -> torch.Tensor:
....
return self.final(x)
你应该在代码中标注类型,
- 它会使你读代码更加容易
- 你也可以使用mypy包来检查参数和函数类型的一致性
在更新代码后,在整个仓库上运行mypy
mypy .
如果mypy找到了问题,就解决它们吧
第六步: Pre-commit hook
一直手动运行flake8, black, mypy是很麻烦的。
一个叫做pre-commit hook的工具可以帮你解决该问题。
将.pre-commit-config.yaml复制到仓库里面来启用它
你首先需要在你电脑上下载pre-commit hook: