keras中關於輸入尺寸LSTM的stateful,return_sequence的問題

補充: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的輸入分爲兩種
keras官方文檔
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基礎,才能理解。

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