如果是从一些比较典型的论文里弄下来的源码,你会发现它们的论文结构往往都非常复杂。不同的模型、不同的论文,可能代码结构组织的方式都不一样。但它们都不外乎就是经历这几个方面:
1、模型和结构模块定义;
2、数据集获取与处理(类似于自定义数据集);
3、然后加载数据训练模型;
4、测试模型;
5、最后进行可视化处理。
顶多就是再加加配置、检查点、优化、日志之类的。
我们自己写代码也是这样写,别人的代码也是这样写,只不过别人的代码可能考虑的更加周到或者更加复杂,但是基本的框架肯定是不变的。
我的理解,不管是你自己去写,还是说你去理解别人的项目结构代码,你就都先去找核心的。像一些比较经典的模型,比如ResNet,ConvNext、AlexNet、Transformer等,你先找到核心的代码是什么,即先抓主要。什么是核心的呢?一般而言,核心的代码都是以model命名,或者就是以它这个模型的名字命名。比如ConvNet模型的代码结构中,核心代码就存储在models文件夹里的ConvNet.py中(当然,在models里面还有convnext_isotropic.py这样一个模型,它也是在论文中提到的模型的一种,和ConvNet.py的略有差别)。如下图所示:
这样,你如果从这一个文件中着手来去开始看的话,那么我相信你应该就能够看明白了。
在这些文件中都是对模型的定义的代码。然后一般情况下,它也会提供预训练的模型给你,这些预训练的模型你可以通过它给定的API接口去进行调用。
然后,在这些代码结束之后,它往往还会有dataset的代码(怎么命名看你自己);一般都是下载数据集的方式,然后将数据进行处理。就是说,在这部分代码里,它保存的是你的数据是如何处理的。如果你自己做项目,那么你可以把这些你肯定都是要有的吧。
再然后就是如何训练的。就是如何train的。
最后你还可以给出的test的效果。
我举两个例子,也是仅限于我的理解哈,不一定完全正确。
1、一个是ConvNet:
这个给的代码就比较详细了。如下图:
在models里面是它自个儿定义的模型。
然后再object_detection和semantic_detection这两个文件夹里面,看名字就知道,一个是用来做目标检测的,一个是用来做图像分割的。那如果你不关心这两个文件夹,你就不用管里面的架构是什么样的。如果你关心你可以再点进去看。、
看外面,dataset.py不用说,就是数据集的加载呀、处理呀等等那一堆儿。就好比我们自己写Demo时的自定义数据集那部分。
然后我看了下,它这里分的非常细,engine.py是训练一次的代码,里面一共就两个函数,你看函数名都知道它是在干嘛的了。
先说在optim_factory.py,真的是代码的功能如其名,这里面定义了许许多多的optimizer的方式,什么sgd呀,lr呀等等都在里面有定义,就是它的意思就是它为提供了很多种optimizer,然后根据你传进来的参数进行选择。它之所以写的这么细,好像是论文里有这么一种对照实验(不太确定,记不太清了)
至于在run_with_submitit.py中,看它的名字,它里面主要的内容应该是用“submitit”这个库进行提交和管理整个作业的。
至于utils.py,一般都放一些其他的函数结构。我个人的理解它有点像大杂烩的意思,或者就是为他人服务的,或者说是常用的接口文件。在这个项目里它主要是定义了运行时间进行记录和对比的函数,以及和日志有关的函数。
最后是main.py,它整个的代码就是在main里面跑的。我觉得main.py应该都不陌生,就是加载数据集、加载模型、跑模型、测试模型等等操作。因为刚刚在其他文件里,只是去给它定义了类的呀,还并未运行起来它。
不过有一说一,这个项目的代码确实很复杂了。
2、换个来说,这是clip的模型代码结构(第二个例子):
这个模型的代码构造感觉就比较简单了。emm所有的txt、ipynb和md文件都不用想,肯定是说明文件。这这里面,clip目录下的几个py文件,基本上就是整个模型的代码了。如果按照我们刚刚的来去思考,你点进去会发现,那个model.py是clip模型的定义部分;然后clip.py是用来给你下载并加载它的预训练模型用的。而simple_tokenizer.py主要定义了一些编码、encode/decode等操作。那个__init__.py文件里啥都没有(就是个空文件)。然后外层的hubconf.py是啥配置文件,但这个配置文件感觉怪怪的,openai给的解释是将PIL的图像转化为模型输入的维度,但是为什么放在这里,以及我觉得里面的代码也挺怪。然后setup.py就是安装这个clip的,如果你运行一下它,你会发现你的文件夹里又多了一个clip的项目哈哈(别问我是怎么知道的)
以上就是我对于文件结构的想法。也正是因为最近要整这一块的内容,所以把我的想法记录了下,也不一定对hhh,而且上面举的那两个模型我现在也还没有研究过(论文也还没看2333),也就是只看了眼代码的结构,所以有什么不对的地方欢迎批评指正(轻点喷....