
做实验离不开写代码,快速写出代码的能力是提升实验效率的关键,本篇博客将具体介绍实验所依赖的代码的结构,实验过程中可以提升效率与质量的一些基本习惯。
项目框架初始状态
实验代码主要由:数据模块, 数据处理模块,模型搭建模块,模型训练模块,实验结果导出模块,日志模块,以及自定义模块组成。
项目开始前实验者应该通过阅读大量文献了解了领域内其他工作的细节(方法,数据,实验等),这部分内容可以写入README.md文档中。一个比较好的形式是,总结阅读过的论文所提到的方法,代码,以及数据,形成一个表格。

除此之外,在确认了方向后,可以在README.md中写下自己的目标,在实验进行中也可以把更新记载到README.md中方便自己不偏离原来的目标。
数据模块:data文件夹
在项目开始阶段,可以确认的是原始数据模块。因而在创立自己的项目文件时,应该已经对实验所需要的数据有清楚的了解,并且将所有的数据都整理好放在一个文件夹下。这里推荐一个项目文件夹的结构是,项目根目录下创建data文件夹,在data文件夹中按照数据的简称建立多个文件夹用于放置不同数据的相关名称。
举例:基数估计常用的4个数据是census13, power7, forest10和dmv11,在这种情况下,data文件夹下的结构是:

接下来,下载的原始数据(通常是csv格式,当然也存在其他格式)放在各自名称命名的文件夹中。项目最开始,data文件夹下的每个数据文件夹只有一个原始的文件,后续进行数据处理将扩充数据文件夹的内容。原始文件建议命名为original.csv,便于后续进行做实验。
这种安排文件夹结构的方法,可以简化后续代码的工作量,同时也能恰到好处的区分每个数据究竟属于的是census13, 还是power7。实验往往要在多份数据上进行重复,这个时候只需要改变代码中的文件路径中的一个部分即可。
上面就是基本的数据文件夹的结构安排,为了后续方便介绍,现进行以下区分
- data文件夹:命名为data的文件夹,其下有多个子数据文件夹用于重复多次实验。
- 子数据文件夹:以数据的名称命名,其下最开始只有一个原始文件,后续会进行扩充。
对data文件夹进行扩充
有时候(大部分时候)并不能直接用original.csv进行训练,需要对original.csv进行一些处理,比如在基数估计领域,我们用到的直接训练数据并不是original.csv,而是workload,label以及original.csv经过data-driven的基数估计模型得到的中间表示。我们需要根据original.csv进行数据处理,得到这些直接使用的数据,并存储成合适格式。
举例:在deepice项目中,我使用的训练数据分2种,一种是只有query的,一种是query+data的。那么我就会生成两大类数据:train_q.csv和train_qd.csv。这里下划线之后的代表具体哪类训练数据。这一步最终生成的文件包括:

至此,data文件夹的创建结束。
数据处理模块
前面提到的数据模块经过数据处理模块得到扩充,这部分建议使用jupyter notebook进行操作,可以实时看到操作后的结果。同时可以使用markdown划分代码结果,标注出来每一个模块具体是做什么操作,从而让数据处理更加明了。

举例:在deepice项目中涉及的数据操作包括,去除非法值,合并操作,取和操作等。无论做了什么,最后结果一定要记得存下来。(ps:存储数据并不一定总能成功,当数据量超大时,很有可能存不下来)
这一步骤中定义的新函数可以加入自定义包中,后续每一步骤中经常使用的代码都可以加入到包中。包的实现将在自定义模块中具体介绍。


模型搭建模块
常用的模型搭建框架是tensorflow和pytorch,二者均可以使用,具体模型搭建方法可以查看之前的博客,这里不赘述。
代码写作套路【1】使用tensorflow构建模型的2种方法
代码写作套路【3】使用pytorch构建模型的2种方法
这里主要是想从实践层面来介绍模型搭建时所需要注意的具体细节。
- 模型搭建出来不一定(大概率不会)取得很好结果:这时需要首先查看损失函数的值,如果损失函数为nan,查看预测结果是否为nan,如果预测结果为nan,说明数据中有inf值或其他非法值,对数据进行进一步处理。如果预测结果不为nan,查看模型参数具体取值,可以通过初始化模型参数调整最开始的损失函数。若进行调整无果,可以尝试改变损失函数。对原来的损失函数取个对数,减小损失函数等。
- 损失函数不下降:问题可能在于优化器和模型结构,建议先调整优化器,后调整模型结构。
- 损失函数下降但没有降到我预期那么小:训练时常可能不够,这时可以对这个模型继续进行训练,训练足够长时间直至损失函数不再下降。
模型训练模块&实验结果导出模块
模型训练的代码写法有2大类,一类是先建个模型,然后训练,最终存储模型;另一类是先加载一个已经训练过的模型,然后基于这个模型继续进行训练。(这应对模型搭建模块中处理损失函数不够小的情况进行的调整)。
值得注意的是无论怎样,训练的模型都必须及时存下来
,否则训练就是白训。为了实时查看模型训练的结果,你可以每训练一些epoch就将模型存储下来。存下来的模型文件的命名可以参考时间戳+对应数据的格式。这些模型文档可以直接存储在以当日日期为命名的文件

本文介绍如何构建实验代码的标准化结构,包括数据模块的管理、数据预处理、模型搭建与训练的技巧,以及日志和自定义模块的实践。通过合理的文件夹组织和代码编写规范,提升实验的可读性和复用性。
最低0.47元/天 解锁文章
848

被折叠的 条评论
为什么被折叠?



