2017-06-10 96 views
0

我是一個新的keras用戶,我想要輕鬆理解如何構建lstm模型。如何處理LSTM模型中的一些時間序列?

在我的數據,我有很多的用戶,其中有許多序列,如下:

user 1 : 
     X   Labels 
    sequence 1 [ 0, 1 , 0, 1] 
    sequence 2 [ 0, 1 , 0, 1] 
    sequence 3 [ 0, 1 , 0, 1 
    sequence 4   ? 

user 2 : 
     X    labels 
    sequence 1 [ 0, 1 , 0, 1] 
    sequence 2 [ 0, 1 , 0, 1] 
    sequence 3   ? 

每個用戶都有序列系列,但不一定是相同的lenght系列。每個系列都對應一個多標籤系列。 我的目標是預測每個用戶下一個序列的標籤,並考慮最後的序列(如時間序列)。

我成功了,當我只使用一個用戶。事實上,我做了一個像 (批量大小,時間步長,特徵)的輸入,其中批量大小等於1,因爲我有一個用戶,時間步長等於序列的數量,特徵等於序列長度。

model_rnn = Sequential() 
model_rnn.add(LSTM(20, return_sequences=True, input_shape=(None, 20))) 
model_rnn.add(TimeDistributedDense(nb_classes)) 
model_rnn.add(Activation("sigmoid")) 
optimizer = RMSprop(lr=0.01,decay=1e-6) 
model_rnn.compile(loss='binary_crossentropy', optimizer=optimizer) 
X_train = X_train.reshape((1,50,20)) 
y_train = y_train.reshape((1,50,109)) 
model_rnn.fit(X_train,y_train, batch_size=1, epochs=200) 

我有兩個問題: 它是重要的,當我適合的模式,即洗牌=假?
當我定義LSTM時,我應該將有狀態選項等於True嗎?

我已經獲得了一個用戶的良好表現。我想對所有用戶使用相同的方法。但我不明白我如何爲所有用戶構建輸入。

例如,我想學習舊的用戶序列並預測他的下一個序列, 我是否會被迫爲每個用戶訓練一個LSTM?或者我可以在一個LSTM中傾斜每個用戶的時間序列? 特別是如果我使用一個LSTM,並且我想預測下一個用戶的序列,那麼模型如何能夠預測好句子,就好像它不知道訓練數據上的這個自己的舊序列。

注意,重要的是要考慮用戶之間的序列是獨立的。

謝謝您的幫助

回答

0

它是重要的,當我適合的模式,即洗牌=假?

不,它不重要,除非將有狀態設置爲True。在下面看到你的下一個問題的答案。


我應該把等於True的狀態選項時,我定義LSTM?

LSTM具有單元,因此按照定義(與Keras中使用的不同)有狀態。 Fabien Chollet給出了這種有狀態的定義:

stateful:Boolean(默認爲False)。如果爲True,則批次中索引i處的每個 樣品的最後一個狀態將用作下一批中索引i的 樣品的初始狀態。

因此,如果在Keras中將LSTM設置爲無狀態,則在每個序列處都會重置單元狀態。使用有狀態模式設置,所有狀態都會傳播到下一批。這意味着位於索引i處的樣本X_ {i}的狀態將用於計算下一批中的樣本X_ {i + bs},其中bs是批量大小(無混洗)。

請注意,默認情況下,Keras混洗(置換)樣本X,並且X_ {i}和X_ {i + 1}之間的依賴關係丟失。因此,如果將有狀態選項設置爲True,請確保設置爲shuffle=False


我要學習老用戶序列,並預測他的下一個序列,我將被迫接受培訓,每個用戶LSTM?或者我可以在一個LSTM中傾斜每個用戶的時間序列?

我相信,你需要一個LSTM,因爲它對一個用戶來說效果很好。您可以將所有用戶的所有序列視爲您的訓練數據,就像您爲一位用戶所做的那樣。

相關問題