2017-10-13 201 views
2

我正面臨着一些懷疑,試圖在Tensorflow下使用多輸入序列(多變量)實現LSTM。張量流中LSTM的多元輸入

我以這種方式定義的LSTM:

def LSTM(x): 
x = tf.reshape(x, [-1, input_length]) 
x = tf.split(x, input_length, 1) 

rnn_cell = rnn.MultiRNNCell([rnn.BasicLSTMCell(n_hidden), rnn.BasicLSTMCell(n_hidden)]) 
outputs, states = rnn.static_rnn(rnn_cell, x, dtype=tf.float32) 
return tf.matmul(outputs[-1], weights['out']) + biases['out'] 

和數據張量以這種方式定義:

# tf Graph input 
X = tf.placeholder("float", [None, input_length, 1]) 
Y = tf.placeholder("float", [None, n_classes]) 

這是確定用於與已知長度的一個維輸入。我會給你一個簡單的例子: 你有每秒測量的降雨率,所以你有一個大小爲N的時間序列。你想提前30分鐘預測降雨率,所以你每30分鐘將數據分成不同的部分。因此,您需要爲LSTM輸入30(分鐘)* 60(每秒一次)的測量值,並且輸出將是從最後一次給定輸入(一次測量)起30分鐘後的降雨率。

到目前爲止,問題已經解決了這個簡單的模型,但我該怎麼做才能添加另一個輸入?也就是說,在30分鐘之後,不是隻使用降雨率來預測自己,而是每秒向LSTM輸入例如溼度和風速。這將是一個帶3個序列作爲輸入的LSTM,每個輸入將包含30分鐘* 60次測量。

我需要添加一個「number_of_sequences」變量,但我不確定如何重新組織張量。我應該從我的代碼中更改什麼?我有點迷失了X佔位符的三個維度,可能是這樣的?

X = tf.placeholder("float", [None, input_length, number_of_sequences]) 

而且還與代碼正常數據庫轉變成一個序列,也許這?:

x = tf.reshape(x, [-1, input_length]) 
x = tf.split(x, input_length, number_of_sequences) 

預先感謝您。

回答

1

我編輯你的代碼,這樣你可以得到你所需要的結果,

input_length = 30*60 
number_of_sequences =3 

X = tf.placeholder("float", [None, input_length, number_of_sequences]) 


x = tf.reshape(X, [-1, input_length*number_of_sequences]) 
x = tf.split(x, input_length, 1) 

現在x是長度爲30 * 60的列表,列表的元素是[的batch_size 3的形狀]。現在x處於tf static_rnn方法所需的形狀。

希望這會有所幫助。

+0

謝謝!有效 :) – DarkHawk