毕竟是野路子出身,以前跑实验,总是每一个模型都有一套完整的代码,从读数据,跑模型,算得分,写代码的过程中也是大量复制粘贴,因为读数据和算得分的代码通常都是通用的。
这次访学,师兄拷给我一份实验环境的代码,看后惊叹原来代码要这样写,耦合解得非常好。但我这种强迫症总是觉得别人写的不漂亮,自己照着重写了一遍,结果并没能领悟其精髓,结果最后跑实验的时候各种出问题。项目好不容易结束,决定认认真真分析一下代码,再重新写一遍。代码在github上同步更新。
目标
我们的目标是写一个可复用的实验环境框架,这样拿到一个新的项目,只要对应的填入一些函数、类,就可以使用了。
那么这个实验环境要有怎样的特性呢?我们希望,在项目进行过程中,如果要添加一个数据集、模型、或是评估指标,只要简单的加入对应的文件就好,而不去影响其他代代码。
这样的一个环境搭好之后,就可以把它当成一个库来使用,编写额外的代码来调用其中的函数。
整体结构
通常来说,一个完整的实验的流程是读取数据、用模型计算结果、对结果进行评估(打分),那么至少就要有三个基类:dataset,model,metric。此外,我们可能有不同的实验设置,例如80%拿来训练模型,20%作为测试集,这样还需要一个基类setting。最后我们再用一个profile类来把这些东西组装起来就好了。整体的结构就可以这样写:
+explib
|-- +datasets
|-- +models
|-- +metrics
|-- +settings
|-- __init__.py
|-- base.py
|-- utils.py
我们将基类都定义在base.py中,utils.py放一些常用的小函数,例如io操作等。模型等具体实现写在对应的文件夹下。
基类定义
首先定义整个实验环境的基类,其实没有也可以,这样写更一致一点。</