![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/d55c4c3e5981a5cee1f7da04c2f8b622.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/509278ab9a128e5d1cbe85aaa3028f60.png)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/c82849ab01026ef34a8804c4273af5bb.jpeg)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/20177a9b7eb661772dc27a2897a4bdc5.jpeg)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/0057afedbf1530f922c605b39d15465b.jpeg)
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/28455311f0d13c791f19fbd1d108ef34.jpeg)
这一点是针对于深度学习项目代码的通用方法,对于一个深度学习项目,我们一般想要了解的最关键点无非就是数据、模型和如何训练等几个方面。
如果你想快速看看这个开源项目的测试效果,直接读readme看使用方法即可。
如果这个项目作者提出了一个新的模型框架,比如说bert,你想了解它的模型框架细节,直接定位到models目录下的带有model字眼的.py文件开始读。
或者是你想看这个项目是如何训练的,都用了哪些训练的tricks,它的参数初始化是如何做的,batchsize用的多大,训练过程中学习率如何调整的等等,那么话不多说,直接定位到带train的.py文件即可。
如下图faster-rcnn的3个训练文件。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/948eb1ea0cedd5cdc816747d0722fc4f.jpeg)
不知道这个问题如何解决,直接谷歌又找不到好合适的方法的时候。
这时候我们可能会寄希望于在GitHub上搜罗一番。
比如说我们想要知道对于极度数据不平衡时如何给损失函数加权重的方法,再比如对于多标签问题进行模型预测时如何找到最佳分类阈值等等。
这些问题都是我们在做实际项目时都可能会碰上的,在这种情况下若是能在GitHub上找到类似场景的处理方法,相信你会瞬间来了精神。
![640?wx_fmt=png](https://i-blog.csdnimg.cn/blog_migrate/64c22bac681ccc13bc328fd833f3a03f.png)
笔者虽然平时偶尔会有去GitHub读一些代码,但说要达到个人精进的level,还远远不够。
比如说前面的PyTorch 750k的源码,这么大的代码量,阅读策略一定是分治思想,分散包围和各个击破。
把项目进行分解,设定阅读计划和目标,在超强的执行力下还是有可能完成的。
这不是普通人干的事,但我相信能在深度学习领域精进的人都不会是普通人。
当然了,我个人的补充是:先看readme文档,先运行成功再说,否则空谈。
遇见bug怎么办?
- 第一类bug,环境不兼容导致的bug,严格按照作者提供的运行环境,并对照环境的版本信息,对齐本地环境和作者要求的环境。
- 第二类bug,深度学习框架带来的bug,这部分bug可以在bing上进行搜索,查看解决方案。
- 第三类bug,项目本身相关的bug,这类bug最好是在github的issue区域进行查找,如果无法解决可以在issue部分详细描述自己的问题,等待项目库作者的解答。
运行顺利的话,代表可以进行debug操作,对文件某些细节不确定的话,可以通过debug的方式查看变量详细内容。
用IDE打开项目:
笔者是vscode党,推荐使用vscode+scp+mobaxterm+远程服务器的方式进行运行。
打开项目以后,从运行入口开始阅读:
阅读入口文件的逻辑,查看调用到了哪些包。
通过IDE的功能跳转到对应类或者函数进行继续阅读,配合代码注释进行分析。
分析过程可能会需要软件工程的知识,比如画一个类图来表述项目的关系。
一开始可以泛读,大概了解整体流程,做一些代码注释。而后可以精读,找到文章的核心,反复理解核心实现,抽丝剥茧,一定可以对这个项目有进一步的理解。
话说回来:深度学习的代码结构是没有一个统一标准的。一方面,代码结构取决于开发者自身的编程观念和水平,有人会一路长函数写到底,有人会利用面向对象进行封装和复用。另一方面,不同规模的项目,本身需要的结构也是很不一样的。Prototype代码讲究简洁易懂,而平台级别的库讲究模块化和可维护性,这也是为什么大家看懂了MNIST上的代码,却经常看不懂开源库的原因。
训练和测试代码一般写在主程序里,也有的会封装成叫train或者test/inference之类的函数。模型定义部分一般是一个独立文件,叫model.py。数据集读取和预处理代码一般在data.py或者utils.py之类的文件里。
参考:
https://www.cnblogs.com/pprp/p/14819944.html
https://www.zhihu.com/question/406133826/answer/1925821995