当前位置: 首页 > 科技观察

比赛结束后代码模型如何处理?KaggleMaster:别删了,这些都是宝藏

时间:2023-03-16 22:30:49 科技观察

被遗忘的比赛代码和权重也可能是宝藏。很多人可能参加过很多比赛,做过很多项目,但是在比赛或者项目结束后,自己写的代码和模型就被扔到一边,甚至很快就被删掉了。这种情况不仅存在于比赛中,也存在于学术领域。学生训练完模型,写好论文,被学术会议录用后,模型的pipeline会被丢弃,训练数据也会相应删除。这是不是有点遗憾?Kaggle长期参赛者VladimirIglovikov在他的博客中指出了这个问题,并提出了重新利用这些资源的一些建议。VladimirIglovikov是一位KaggleGrandmaster,曾在Kaggle全球排行榜上排名第19位,并赢得了Carvana图像掩蔽挑战赛(见他的个人经历:《Kaggle Grandmaster 是怎样炼成的》)。在他看来,比赛中使用的代码、权重等资源都是一笔宝贵的财富,可以帮助大家巩固技术知识,打造个人品牌,提高就业机会。为了说明这些资源资源的价值,他还创建了一个GitHub项目(retinaface),专门讲述提案的正文。项目链接:https://github.com/ternaus/retinaface下面是博客的具体内容。花5分钟将您的代码发布到公共GitHub存储库很多时候,您的代码可能已经在GitHub上,但在私有存储库中。什么是宣传损失?在某些情况下,某些代码确实不适合公开,但您在Kaggle中所做的那些动手项目、解决方案和论文可能不是必需的。为什么有些人不愿意透露?因为很多人认为,“所有公开发布的代码都应该是完美的,否则就会被批评”。但现实是,别人根本不在乎,你随便放。公开代码是心理防线的重大突破,公开不完善的代码是自信大胆的举动。后续的所有步骤也都基于此步骤。花20分钟提高代码可读性您可以通过添加语法格式化程序和检查工具来提高Python代码的可读性。这并不困难,也不费时。检查器和格式化程序不会将坏代码变成好代码,但它们会提高可读性。以下是步骤:第1步:文件配置将这些文件添加到存储库的根目录中。setup.cfg—flake8和mypy的配置。pyproject.toml—黑色的配置。第2步:需求使用以下命令安装所需的库:第3步:black格式化代码的方式有100,500多种。black或yapf等格式化工具根据一组预定义的规则修改代码。阅读具有特定标准的代码库会更容易。当您花费数小时编写代码并需要在不同编码风格之间切换上下文时,您的意志力可能会耗尽。所以没有充分的理由不要这样做。运行以下命令将重新格式化所有python文件以遵循黑色规则。第四步:flake8运行以下命令不会修改代码,但会检查代码是否存在语法问题,并输出到屏幕上。然后修改那些问题。第五步:mypyPython不强制静态类型化,但是建议给函数参数和返回类型添加类型。例如:您应该在代码中添加输入。这使代码更易于阅读。您可以使用mypy包来检查参数和函数类型的一致性。更新代码后,在整个存储库上运行mypy:如果mypy出现故障,请修复它们。第6步:预提交挂钩一直手动运行flake8、black和mypy会让人厌烦。一个名为pre-commit的钩子可以解决这个问题。要启用它,请将以下文件复制到您的存储库中:https://github.com/ternaus/retinaface/blob/master/.pre-commit-config.yaml您需要使用以下命令安装预提交包。使用以下命令进行初始化:安装后,每次提交都会经过一组检查。当提交有错误时,检查将不允许提交通过。这与手动运行black、flake8和mypy之间的区别在于,它不是乞求你修复问题,而是强迫你去做。因此,这种方法不会浪费您的意志力第7步:Github操作您已将签出步骤添加到预提交挂钩并在本地运行它们。但您还需要第二道防线——让GitHub对每个拉取请求运行这些检查步骤。您所要做的就是将以下文件添加到您的存储库中:https://github.com/ternaus/retinaface/blob/master/.github/workflows/ci.yml执行以下代码告诉GitHub要检查的内容:我也建议放弃将代码直接推送到master分支的做法。可以新建一个分支,修改代码,提交,放到Github上,创建PR,合并到master。这是一个行业标准,但在学术研究和Kaggle竞争对手中并不常见。如果您是这些工具的新手,可能需要20分钟来添加它们并修复错误和警告。记住这个操作。在您的下一个项目中,您甚至可以在编写代码之前的第一次提交中添加这些检查。从这点开始,每一个小的提交都被签入,你每次最多只需要修复几行代码。这是便宜的好习惯。花20分钟写一个好的自述文件一个好的自述文件有两个作用:对你自己:你可能认为你永远不会再使用这段代码,但你真的没有。下次用的时候你可能记不住它的具体内容,但是readme可以帮到你。对于其他人:自述文件是一个卖点。如果人们看不到存储库的用途及其解决的问题,他们就不会使用它,您所做的所有工作也不会对其他人产生积极影响。机器学习库的最低要求是说明以下内容:任务是什么以及如何解决它的图表,没有任何文本。花了几个星期解决问题后,你可能有100,500张图,但你不能把它们放在自述文件中;将数据放在哪里;如何开始训练;如何做推理。如果你需要写100,500字来描述如何运行训练或推理,那么你的项目就有问题了。您需要重构代码以使其更加用户友好。经常有人问:如何提高写代码的能力?这是锻炼你的机会。您可能需要重写代码,尝试从别人的角度来看您的自述文件。这是一个很好的锻炼机会,它可以让你学会站在用户的角度看问题。花20分钟提高模型可用性我猜你会写下面的代码来加载预训练的模型权重。使用上述代码从retinaface.pre_trained_models导入get_modelmodel=get_model("resnet50_2020-07-20",max_size=2048)。如果权重不在磁盘上,则从网络下载它们并缓存在磁盘上。初始化模型,并加载权重,这是用户友好的,也是你在torchvision和timm库中看到的。第1步:托管预训练模型的权重这对我来说是最大的障碍。如果我不想使用AWS、GCP,我应该在哪里加权我的模型?在GitHub上发布是一个不错的选择。每个文件的大小限制为2Gb,这对于大多数深度学习模型来说绰绰有余。第2步:编写一个函数来初始化模型并加载权重。我给出的示例代码如下:构建ColabNotebook和WebApp时会用到这个函数。花20分钟创建一个库这一步是为了减少模型的入口点。第一步:在requirements.txt中添加必要的依赖,可以手动更新或者使用下面的代码:第二步:改变版本库的文件结构创建一个“主文件夹”,在我给的例子中,这个文件夹叫做“视网膜脸”。将所有重要代码放入此文件夹,但不要放置辅助图像、自述文件、笔记本或测试。手动执行此步骤并更新所有导入会很累人。PyCharm或类似的IDE将为您执行此步骤。这是在存储库中构建代码的常用方法。如果你想让它更有条理,请查看CookieCutter包。第三步:添加配置文件在根目录下添加setup.py,内容与示例文件“setup.py”中的内容类似。添加包的版本,在我的示例中,我将其添加到主文件夹的init文件中。第4步:在PyPI上创建一个帐户。第5步:构建库并将其上传到PyPI。您的存储库是一个库,每个人都可以使用如下命令安装它:如果您查看PyPI上的包页面,您会看到它使用存储库中的自述文件来说明项目。我们将在GoogleColab和WebApp上使用此步骤的功能。最好花20分钟创建GoogleColab笔记本并将Jupiter笔记本添加到存储库,以展示如何初始化模型和执行推理功能。在前两步中,我们使用了模型初始化和pip安装。接下来创建一个GoogleGolab笔记本。现在,只需一个浏览器,就会有更多人试用您的模型。不要忘记在自述文件中添加指向笔记本的链接,并在PyPi上更新版本。在20分钟内创建Web应用程序许多数据科学家认为构建Web应用程序是一个复杂的过程,需要专业知识。这种想法是正确的。用于复杂项目的Web应用程序确实需要数据科学家所不具备的大量专业知识,但是构建一个简单的Web应用程序来显示模型是很容易的。我为Web应用程序创建了一个单独的GitHub存储库。但是,您仍然可以在存储库中使用您的模型。这是描述细节的技术博客:https://towardsdatascience.com/deploy-streamlit-on-heroku-9c87798d2088。第一步:为应用程序添加代码:第二步:添加配置文件您需要添加以下文件:setup.sh-该文件可以直接使用,无需更改。Procfile—您需要使用应用程序修改的文件的路径。第3步:添加一个requirements.txt文件第4步:在herokuapp上注册第5步:执行以下代码:花4个小时写一篇技术博客许多人低估了他们研究的价值。事实上,您的文章很可能会帮助他人,并为您自己的职业生涯提供更多机会。如果您正在撰写有关机器学习的文章,我建议您包括以下内容:研究问题是什么?你是如何解决这个问题的?示例如下:项目:https://www.kaggle.com/c/sp-society-camera-model-identification博客:http://ternaus.blog/machine_learning/2018/12/05/Forensic-Deep-Learning-Kaggle-Camera-Model-Identification-Challenge.html花时间写一篇论文描述你在这个机器学习竞赛中的解决方案即使你的论文没有突破,它也会被发表并帮助其他人。写学术论文也是一种技能。你现在可能不具备这种技能,但你可以与擅长学术写作的人一起工作。下面是我的谷歌学术引用,由于我写的总结机器学习竞赛的论文,这些年来我的引用猛增。当然,你的论文也包含在一个大包中,其中还包括:一个代码干净的GitHub存储库和一个很好的自述文件。非ML人员可以使用的库。允许在浏览器中快速试验模型的Colab笔记本。吸引非技术受众的WebApps。用人类语言讲述故事的博客文章。有了它,它就不仅仅是一篇论文,而是一个全面的战略,可以显示您对项目的所有权并帮助您与他人沟通。两者对你的职业生涯都至关重要。