訓練LSTM——一路的坎坷

很久沒寫博客了,今天必須記錄一下這個大轉折。

最近一直在研究語言模型,找了一個做文本生成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(昨天新學的),總算皆大歡喜了,還好我沒有放棄。

安慰自己:有時候一個不起眼的小問題就是能折磨你好幾天,等發現問題後,都想跪了,也算有收穫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章