補充:return_sequence,return_state都是針對一個時間切片(步長)內的h和c狀態,而stateful是針對不同的batch之間的。多層LSTM需要設置return_sequence = True,後面再設置return_sequence=False.
最近在學習使用keras搭建LSTM的時候,遇到了一些不明白的地方。有些搞懂了,有些還沒有搞懂。現在記下來,因爲很快就會忘記!-_-!。
具體的LSTM的原理,我這裏不贅述了。給一些很好的參考鏈接。
LSTM公認聖經,中文翻譯版
1. 輸入數據維度
我們知道RNN、LSTM適應於時序數據。我們需要按照構造一定的輸入數據形式sequence。
實際上來講,就相當於一個滑動窗口,不斷的向前滑動。一個窗口就成了一個樣本batch。
後續有時間,我畫個圖!
在keras中,RNN、LSTM的輸入分爲兩種:
1)stateless,無狀態設置。
輸入爲input_shape=(time_steps,input_dim),其中time_steps就是每段sequence的長度,input_dim就是輸入數據的維度(特徵個數)
2)stateful=True,有設置狀態。
輸入爲batch_input_shape=(batch_size,time_steps,input_dim),其中batch_size就是批量,每批訓練的個數。
2. 輸入/輸出數據尺寸
那如何設置輸入數據sequence的長度,和輸出的長度呢?這兩個長度對於預測的準確性是有影響的。
主要結合數據的週期特性,以及預測任務的需求。具體內容,我還在研究,後續補充。
有些文章建議使用貝葉斯優化的方式,確定輸入、輸出的長度。實際上就是參數搜索的方式了。
3. stateful的設置
RNN/LSTM有個states的狀態可以設置,具體states的原理,請參數最開始的LSTM原理鏈接。
stateful分爲stateless和stateful=True。
1)stateless
- 無狀態設置,即在LSTM訓練時候,每個批次batch之間,是沒有聯繫的。
- 在model.fit()擬合的時候,keras默認把數據打亂shuffle,並且每次batch,都會重置states。
2)stateful=True
- 有狀態設置,即在LSTM訓練時候,按照batch_size大小,Xi+b的數據的初始狀態,會受到Xi的影響。i+b就是數據的批次,b代表batch_size的大小。也就是每個批次之間,是有聯繫的。
- 在輸出尺寸部分,需要輸出batch_size,即batch_input_shape=(batch_size,time_steps,input_dim)
- 在model.fit()擬合的時候,需要設置shuffle=False。
4. 參考鏈接
keras中stateful的聖經
keras中stateful的示例
keras中LSTM的stateful中文解釋及代碼
有些地方寫的不清楚,歡迎討論。另外這個,需要有點LSTM和keras基礎,才能理解。