SuperZLW's Blog

我很笨,但是我不懒

0%

一次项目的反思和总结

前言

在这次Data Science2 的课程项目中,选了Kaggle上一个正在进行的比赛作为课题,这应该是我第一次跟人合作做这么大的项目,也是我第一次正经参加Kaggle的比赛,整个比赛过程走了很多弯路,踩了很多坑,觉得非常有必要做个记录,作为督促自己的成长吧。第一部分主要是一些反思和总结,另外在这两个月里看了不少论文,准备每天写一点,放在第二部分了。

反思1:整体规划

问题:

在这个项目中,我一开始并没有一个清晰的规划,认为可以像做其它课程小项目一样,先做着,有问题查资料,反正就一直做下去,属于船到桥头自然直的那种,这就是“走弯路”的开始。大项目不比小项目,大项目一开始就会有很多个方向需要选择,并且每个方向会遇到的事都不明朗,如果一开始不做充足的调查准备工作,随意凭直觉或者一些不太靠谱的依据选一个方向,如果错了,就得重新来过,非常浪费时间。\

总结:

根据队友的经验,这种程度的项目理应有两个规划,动态和静态的,或者也可以说是短期和长期。静态规划是一个比较笼统的东西,但花的时间应该是非常多的,首先,我们得知道,一开始我们有多少个方向可以选择,每个方向大致需要做什么工作,可能会出现的问题,以及需要经历的阶段,这个静态过程非常耗时,但这是为了节省后面的时间,提高后面的效率,规划到什么程度这是经验性的东西,不好说,现在我也没什么概念,但这时间一定得花。第二是动态规划,也就是短期的,因为静态规划只是一个大概的东西,具体在进行的过程中会出现很多不确定的因素,遇到这些问题短期内我们要怎么做,这就是动态的,也应该是具体的。\

实例:

以这次项目为例,做细胞实例分割,一开始的时候以Anchor-free 和 Anchor-based 将四人小组分为两个,我和另一个人做Anchor-based ,其实这个时候我们应该花时间做静态规划的,但我们没有,而是直接来了个短期的目标,做pipeline,包括基于Pytorch的Dataset和Dataloader,这个对我们的项目很重要,但根据后面的发展,这个对比赛不重要。还有数据集的处理,Kaggle讨论区其实有非常多的资源,甚至现成的代码或者别人已经处理好的数据集,但我们没有看,这部分花了非常多的时间。所以,如果我们一开始就花一定的时间充分了解比赛,了解Kaggle平台能提供的资源,后面的进度会快很多。\

反思2:模型的选择

问题

这个比赛中我们尝试了非常多的模型,而且犯了一个大忌:从复杂到简单。回头想想这真的很要命,一开始我们的思路非常简单,因为这是实例分割,就从COCO数据集里找模型,在排名靠前的模型里找,确定了个:CBNetV2 + Swin Transfomer + HTC, 参数量一两个亿,丝毫没有考虑到我们现有数据集的量能不能训出这模型,也基本没有考虑训这模型我们所需要的时间已经金钱成本。

总结:

其实Olivier说的非常有道理,我们应该先定下一个baseline model,比如我们这里定的是Mask RCNN,我们就应该先努力去调它,调出一个好的结果,然后再根据需要慢慢改进或者复杂化,而不是一上来就搞一个超级复杂的模型,我们压根没那些时间,硬件,金钱去调这种模型,数据量也不够,最后训出来的结果非常差,而且对于这么大的模型,要调参我们无从下手,一个模型跑两天我们真是疯了。

反思3:认清自己以及比赛

问题:

就是我们要量力而为,一开始我居然想在半个月里手写HTC,真是疯了,这也花了不少时间。也就是在这个时候我们基本确定了用MMDetection 搭建模型,之前走了这么多弯路,直到这时候我们才有半只脚踏上了正规,但我们依旧在错误的路上走着,想用MMDetection个非常复杂的模型。

总结:

正确了解自己能力和所要处理的问题之间的差距。另外也要时刻思考,现阶段我们需要实现什么,同时也要思考下一阶段的部署,不要说多么长远,至少,三天以内的安排得清楚。队友进度一直走在我前面,应该就是他不停在思考短期的计划,并且行动力也跟得上。\
到后面用MMDetection的时候,其实我们已经是在单纯地调config的参数了,而且调的时候既没有经验或实验数据支持,也没有理论支持,只能调一些最简单直观的,说难听一点,这个工作给任何一个毫无相关专业知识的中学生可能都能做。Kaggle不应该是用这种方法就能拿到好分数的比赛。\

回顾

站在现在回顾这个比赛,我认为合理的流程或许应该是这样的:\

  1. 了解比赛规则,包括提交的东西,能不能联网,训练时间的限制,能否使用外部数据集等,能有多具体就做多具体。\
  2. 了解数据集的构成,哪些有用哪些没用。\
  3. 前两步一定要去讨论区看看,看看别人对这比赛的想法,对这数据集的看法以及处理方法。\
  4. 确定baseline model,这步很重要,如果像这个比赛一样很直观的话,可以直接定下 Mask RCNN,如果不了解,找论文,论文的来源,讨论区或许有,如果不想看论文,翻翻讨论区,看出现频率最高的模型是哪个,再去深入了解。\
  5. 搭好模型,弄好数据集,尽早提交第一次成果。根据分数调整baseline model,让分数尽量高,调整灵感可来自讨论区,和实验的结果分析。\
  6. 当baseline model 已经达到自己所能调整的极限时,开始往外拓展,在baseline model的基础上进行模型复杂化,以Mask RCNN为例,可以改backbone,可以加上cascade,然后把之前Mask RCNN调好的参数用上去,或许不一定很契合,需要微调,但我认为这种做法并不坏。但要注意的是,每次更改模型就选一个方向,比如先改backbone,调到最优,再改其它,有队友的话可以各自负责一个方向,但基底应该是一样的。\

总结

总而言之,通过这个比赛真真切切认识到规划的重要性,接下来想多找几个项目积累经验,另外,MMDetection的源码得看,下次再用的时候不能只局限于调config。\
暂时只想到这些,之后再仔仔细细回顾整个过程,或许还有补充。

------ 本文结束------