當前位置: 首頁>>技術問答>>正文


了解Keras LSTM

我試圖通過這篇文章http://colah.github.io/posts/2015-08-Understanding-LSTMs/加強對LSTMs的理解,並使用Keras實現了LSTM。同時也關注了為Keras教程編寫的http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/博客。我主要困惑的是,

  1. 將數據係列(data series)重新組織(reshape)到[samples, time steps, features]中,

  2. 有狀態的LSTMs

讓我們把注意力集中在以上兩個問題上,參考下麵的代碼:

# reshape into X=t and Y=t+1
look_back = 3
trainX, trainY = create_dataset(train, look_back)
testX, testY = create_dataset(test, look_back)

# reshape input to be [samples, time steps, features]
trainX = numpy.reshape(trainX, (trainX.shape[0], look_back, 1))
testX = numpy.reshape(testX, (testX.shape[0], look_back, 1))
########################
# The IMPORTANT BIT
##########################
# create and fit the LSTM network
batch_size = 1
model = Sequential()
model.add(LSTM(4, batch_input_shape=(batch_size, look_back, 1), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
for i in range(100):
    model.fit(trainX, trainY, nb_epoch=1, batch_size=batch_size, verbose=2, shuffle=False)
    model.reset_states()

注意:create_dataset采用長度為N的序列,並返回一個N-look_back數組,其中每個元素都是look_back長度序列。

什麽是時間步驟和特征?

可以看出TrainX是Time_steps的三維數組,特征分別是最後兩個維(在這個特定的代碼中是3和1)。關於下麵的圖片,這是否意味著我們正在考慮many to one情形,其中粉紅色框的數量是3?或者它是否意味著鏈長是3(即隻考慮3個綠色框)。

python,deep-learning,keras,lstm

當我們考慮多元係列時,特征參數是否變得相關?例如同時建模兩個金融股?

有狀態的LSTM

有狀態的LSTM是否意味著我們在批次間保存單元內存值?如果是這樣的話,batch_size就是一個,而且訓練運行之間的 memory 是重置的,所以說這是有狀態的。我猜這是與訓練數據不做洗牌(shuffle)有關,但是不太確定。

有什麽想法嗎?圖片參考:http://karpathy.github.io/2015/05/21/rnn-effectiveness/

編輯1:

下麵的API調用是否與展開圖相對應?特別注意第二張圖(batch_size是任意選擇的):

python,deep-learning,keras,lstm

python,deep-learning,keras,lstm

編輯2:

對於那些已經完成Udacity的深度學習課程,仍然對time_step參數感到困惑的人,請看下麵的討論:https://discussions.udacity.com/t/rnn-lstm-use-implementation/163169

更新:

原來model.add(TimeDistributed(Dense(vocab_len)))是我正在尋找的。這裏是一個例子:https://github.com/sachinruk/ShakespeareBot

UPDATE2:

我在這裏總結了我對LSTM的大部分理解:https://www.youtube.com/watch?v=ywinX5wgdEU

最佳解決辦法

首先,你選擇了很好的教程(12)來啟動。

Time-step表示:X.shape(描述數據形狀)中的Time-steps==3表示有三個粉紅色的框。由於在Keras每一步都需要輸入,所以綠色框的數量通常應該等於紅色框的數量。除非你破解這個結構。

多對多與多對一:在keras中,在初始化LSTMGRUSimpleRNN時有一個return_sequences參數。當return_sequencesFalse時(默認),則如圖所示為多對一。它的返回形狀是(batch_size, hidden_unit_length),它代表最後一個狀態。當return_sequencesTrue時,則是多對多。它的形狀是(batch_size, time_step, hidden_unit_length)

特征參數是否變得相關:特征參數意味著“您的紅色框有多大”或每個步驟的輸入維度是什麽。如果您想預測8種市場信息,那麽您可以使用feature==8生成您的數據。

有狀態:您可以查看the source code。當初始化狀態時,如果stateful==True,那麽上次訓練的狀態將被用作初始狀態,否則會產生一個新的狀態。我還完全理解stateful,但是,我不同意batch_size隻能在stateful==True時為1。

目前,您使用收集的數據生成數據。假設您的股票信息即將到來,而不是等待一整天收集整個序列,你需要在線產生輸入數據,同時訓練/預測。如果您有400個股票共享一個網絡,那麽您可以設置batch_size==400

參考文獻

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/3712.html,未經允許,請勿轉載。