很久没写博客了,今天必须记录一下这个大转折。
最近一直在研究语言模型,找了一个做文本生成的LSTM,想用来检测句子的流畅性,把训练集替换成我们自己的,然后就开始训练模型。
对于一个LSTM小白,刚开始很排斥去搞明白它的原理,然而,事实证明,我早晚得弄明白它,绕不过去,还不如早早研究,不至于浪费这么长时间,这次真真的给了我一个教训啊!!!
重点来了:
1. 网上做文本生成的训练集一般都是散文诗集之类的,所以找的这个代码作者训练的时候不用考虑断句。因为有标点符号之类的特殊字符,而且需求是学习训练语料的说话方式,只要生成的文本语义合理即可。一开始的无知,直接替换掉训练集就开始训,训完就测,结果当然跟想象中的不一样了。
后来发现,我们的训练集是要需要考虑分行的,所以input的时候得保证一行一行的喂。行与行之间不能直接首尾相连。然后就在这个代码上改,按我的方式喂数据,事实证明,结果跟预期差不太多,给我激动的啊。
所以,训练之前,一定要先搞明白大家的需求是不是一样,原理清楚了,觉得OK了,再训练,还是不能太心急。
2. 训练完之后,找了几条数据测试了一下,结果还可以,于是就要把模型放进我的项目里用。因为我们项目留的接口是把模型的网络结构和参数打包成.pb文件(我用的TensorFlow,训练完会把参数和网络结构分开保存,我需要把.ckpt文件和.pbtxt文件做freeze)。顺利打包完之后,就拿一条测了一下,万万没想到,同样的数据每次的结果都不一样,耽误了两天还是没想明白为什么,就想着,反正每次的结果都相差不大,先凑活用,批量测试看看改之后的模型效果如何。当时没注意到测试速度的问题,就开始批量测试了。阿欧,原本10分钟就测完的数据,跑了一晚上才测了1/4,我都惊呆了。想不明白,我也没做什么大改动啊,不至于这么慢。可能一大早头脑比较清醒,我对比了新模型的网络大小,参数大小与之前用的文件大小,我的新.pbtxt竟然比之前的大很多,然后我又去读了一下代码testmodel.py。结果,是我把train的pbtxt当成test的用了。又重新freeze之后测试,速度明显快了,而且之前的每次测试结果都不一样问题也随之解决,Kill two birds with one stone(昨天新学的),总算皆大欢喜了,还好我没有放弃。
安慰自己:有时候一个不起眼的小问题就是能折磨你好几天,等发现问题后,都想跪了,也算有收获。