Github-jcjohnson/torch-rnn代码详解
[email protected]
http://www.cnblogs.com/swje/
作者:Zhouwan
2016-3-18
声明:
1)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应。如果某部分不小心侵犯了大家的利益,还望海涵,并联系博主删除。
2)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。
请联系:[email protected] 或[email protected]
本研究课题系本人本科毕业论文,具体学习计划见http://www.cnblogs.com/swje/p/5068069.html,
后面会实时更新,希望能与大家相互交流,共同进步!
继karpathy的cha-rnn之后,最近在看jcjohnson写的torch-rnn,作为梳理和总结,发表此篇文章记录一下。
源文件及参考文献如下:
torch-rnn代码@Github:https://github.com/jcjohnson/torch-rnn
学习体会:
1、torch-rnn 提供了一个高性能、可再用的RNN和LSTM模块,使用这些模块对字符级别的语言建模和char-rnn是类似的。RNN和LSTM模块仅仅依赖于torch和nn,所以可以很容易地整合到现有的项目中。相比于char-rnn,torch-rnn的速度快了1.9倍,并且节约了七倍的内存。
2、实验运行环境:需要安装Python 2.7 和HDF5 库的头文件;预处理脚本使用Python 2.7编写的;实验需要在torch7平台运行,并用LUA语言编程;为了提供CUDA和OpenCL支持以进行GPU加速,需要安装相应的LUA安装包。
3、要想训练一个模型并用它来生成新的文本,需要遵循以下三个步骤:
- 数据预处理:在训练前,需要用脚本scripts/preprocess.py对数据进行预处理,这将会生成一个包含数据的预处理版本的HDF5 文件和 JSON 文件。 比如生成了
my_data.h5
和my_data.json
两个文件。
- 训练模型:预处理之后,需要用脚本train.lua 来训练模型。这一步是最慢的。
可以运行下面的代码来训练:th train.lua -input_h5 my_data.h5 -input_json my_data.json。以上代码将会读取存储在my_data.h5
和 my_data.json两个文件中的数据,
运行一段时间后,将会生成检查点文件checkpoint,文件命名类似cv/checkpoint_1000.t7。
你可以通过参数设置改变RNN模型类型、隐藏层大小和 RNN层数,选择使用CUDA在GPU模式下运行或在CPU模式下运行,也可以选择是否使用OpenCL,还有其他参数设置,参考这里。
- 从模型中抽样:训练完一个模型之后,你可以通过使用脚本sample.lua从文本中抽样来生成新的文本。运行以下代码:th sample.lua -checkpoint cv/checkpoint_10000.t7 -length 2000,将会从前一步载入训练好的检查点集 ,从中抽取2000个字符,并将结果打印到控制台上。
你可以通过参数设置,选择使用CUDA在GPU模式下运行或者在CPU模式下运行,也可以选择是否使用OpenCL,还有其他参数设置,参考这里。
4、为了用基准问题测试torch-rnn和char-rnn,我们对莎士比亚散文集训练LSTM语言模型,RNN层数和RNN大小分别设置为1、2、3层和64、128、256和512,并将minibatch大小设为50,序列长度设为50,dropout设为0。对于同一大小RNN模型的两次实验中,在前100次训练迭代过程中,我们记录下向前和向后传播的时间和GPU的内存使用情况,并使用这些测量值来计算平均时间和内存使用情况。所有的基准测试程序数值都是在一个配置有 Intel i7-4790k CPU, 32 GB 主存和带有一个 Titan X GPU的机器上运行的。
从实验结果出可以看出,torch-rnn在任何模型大小下都比char-rnn运行速度快,小模型的加速比更大一些。对于有128个隐藏单元的单层LSMT来说,加速了1.9倍;对于较大的模型,我们达到大约1.4倍的加速。
从节约GPU内存方面来看,torch-rnn在所有的模型大小上都胜过char-rnn,但是,对于较大一些的模型节约内存更多一些,例如:对于有512个隐藏单元的模型来说,torch-rnn比char-rnn少用了七倍内存。