理解LSTM中的return_sequence和return_state看這裏。解釋的很詳細:
理解LSTM在keras API中參數return_sequences和return_state
推薦英語原文Stateful LSTM in Keras
文中使用三個問題來解釋了這個參數:
-
給定了一個長序列(eg 時間序列),然後把它分爲一些更小的子序列來構造輸入矩陣
X
,LSTM是否能在序列之間找到依賴的關係?除非我們指定使用有狀態的LSTM,否則LSTM無法找到序列之間的依賴關係。
但大多數問題都可以通過無狀態LSTM來解決,所以確保你真的需要有狀態模式,再將
stateful
設爲True
。在無狀態模式下,長期記憶並不意味着LSTM將記住先前批次的內容,這裏的批次指的是
batch
。 -
爲什麼我們在Keras中區分無狀態LSTM和有狀態LSTM?
LSTM具有cell,因此根據定義是有狀態的(這個指的是隱藏層的狀態)。
Fabien Chollet給出了有狀態的定義:
stateful:Boolean(默認爲False)。 如果爲True,則批次中索引i處的每個樣本的最後狀態將用作後續批次中索引i的樣本的初始狀態。
換句話說,無論何時訓練或測試LSTM,首先必須構建形狀爲
(nb_samples,時間步長,input_dim)
的輸入矩陣X
,其中batch
批量大小除以nb_samples
。例如,如果
nb_samples = 1024
且batch_size = 64
,則表示您的模型將接收64個樣本的塊,計算每個輸出(無論每個樣本的時間步數是多少)的平均梯度並傳播它以更新參數向量 。默認情況下,Keras在
X
中對樣本進行shuffles
(置換),並且和之間的依賴關係丟失。也就是爲什麼當我們使用有狀態的LSTM時,在對模型fit
時,shuffles
爲False
,確保順序不被打亂。假設我們沒有對其進行
shuffles
操作。如果模型是無狀態的,則在每個序列處重置單元狀態。 使用有狀態模型,所有狀態都將傳播到下一批。 這意味着位於索引i
,的樣本的狀態將用於計算下一批中的樣本,其中bs
是批量大小(無混洗)。 -
爲什麼Keras在有狀態模式下需要批量大小?
當模型是無狀態時,Keras爲大小爲
output_dim
(LSTM中的cell數)的狀態分配一個數組。 在每個序列處理中,重置該狀態數組。在有狀態模型中,Keras必須在批次中傳播每個樣本的先前狀態。 參考上面的解釋,批#1中的索引
i
處的樣品將知道批#0中樣品i
的狀態。 在這種情況下,存儲狀態的數值結構形狀爲(batch_size,output_dim)
。這就是必須在創建LSTM時指定批量大小的原因。 如果不這樣做,Keras可能會引發錯誤提醒:如果RNN是有狀態的,則必須提供完整的input_shape(包括批量大小)。