本文共 1583 字,大约阅读时间需要 5 分钟。
看论文时,如果论文中有对自己研究方向有帮助或者具有实际用处的模型时,不免通过编程对其进行实现。如果是一个简单的模型,用个caffe、tensorflow之类的框架跑跑就出来的那就无所谓了,但是如果是一个稍微复杂,或者以后会用来做对比实验之类的模型,要是随随便便用个jupyter或者记事本写了出来连个注释都没有,那么当你要用到的时候就该后悔了。现在我就是遇到了这种情况。。。。所以想整理下编程实现模型的经验和总结,为以后能养成一个比较好的习惯打下基础。
写代码时加注释这个说起来简单但是做起来难的习惯就不多说了,做个web项目或者app之类的都要加注释,就不用说那种全是计算、求导和公式的模型了,说不定哪天用上了光理解这个模型的时间就够重新写了。之前看了老师写过的一个聚类算法,没有注释,然后就光理解这个算法就用了一个寒假。
封装的目的也很明确了,既然能作为面向对象的三大特性之一,那么封装的好处肯定是从古人到现在都有目共睹的。那么说下在对模型实现过程中对封装的体现:
再多说下对模型进行封装的好处,还是举个例子,自己辛辛苦苦写出了个聚类算法,或者是在论文中进行模型浮现的聚类算法,后面正好自己又打算写一个聚类算法的论文,之前写过的代码既没有封装又没有注释的话,岂不是这些工作又要再花上一些时间了。相反,如果封装的很好的话,直接换上数据进行调用就可以了。
在做实验时,肯定会对数据进行读取啊,数据进行训练集、测试集划分啊,还有就是训练、测试次数的设置之类的。如果一个个进行修改也不是很费力,但是如果对实验数据也做一个类似的封装的话,每次只需在main中调用时修改就可以了,就不需要每次在函数内部或者参数上进行修改了。还是举个例子:有三个模型,三组数据,每组数据的训练和测试集长度、名称、训练次数等信息不一样,如果封装一个类似如下,通过这个class进行调用的话,直接修改参数,然后将这个对象作为参数传递到模型中调用就方便多了。
class Data(object): def __init__(self, path, name, train_num, train_len, test_len): self.path = path self.name = name self.train_len = train_len self.test_len = test_len self.train_num = train_num
在做实验时,好不容易跑出了个结果然后结果全打印在了控制台上,一不小心将控制台的内容清空了就傻眼了。
所以说实验结果最好写在一个日志文件中。也可以通过封装一个类,将每次要打印的信息,如每次迭代的结果、准确率、收益之类的写入这个文件中。文件要以append形式写入。
写代码实现模型时,一个最最最重要的问题我竟然忽略了,一个谁都明白的道理——不要写错了。在做模型时,一定要写完一部分就测试一下是否存在什么低级的bug,否则都实现好了或者实验结果都出来了再改代码就炸了。
以后总结出新的想法和得到的教训再追加。
转载地址:http://euklf.baihongyu.com/