2017-10-13 5 views
2

Ich bin mit einigen Zweifeln konfrontiert, die versuchen, LSTM mit mehreren Eingabesequenzen (multivariate) unter Tensorflow zu implementieren.Multivariate Eingabe für LSTM in Tensorflow

I definiert ist, die auf diese Weise 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'] 

und die Daten Tensoren auf diese Weise definiert ist:

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

, die für einen eindimensionalen Eingang mit einer bekannten Länge in Ordnung ist. Ich gebe Ihnen ein einfaches Beispiel: Sie haben die Regenrate jede Sekunde gemessen, so haben Sie eine Zeitreihe der Größe N. Sie möchten die Regenrate 30 Minuten im Voraus prognostizieren, so dass Sie die Daten alle 30 Minuten in Segmente teilen. Sie würden also den LSTM mit einer Eingabe von 30 (Minuten) * 60 (eine pro Sekunde) Messungen versorgen, und die Ausgabe wäre die Regenrate nach 30 Minuten von der letzten gegebenen Eingabe (eine Messung).

Bis hier ist das Problem mit diesem einfachen Modell gelöst, aber was soll ich tun, um eine weitere Eingabe hinzuzufügen? Anstatt nur die Regenrate zu verwenden, um sich selbst nach 30 Minuten zu prognostizieren, sollte der LSTM auch mit der Luftfeuchtigkeitsrate und der Windgeschwindigkeit pro Sekunde versorgt werden. Das wäre ein LSTM mit 3 Sequenzen als Eingänge, und jeder dieser Eingänge würde 30 Minuten * 60 Messungen enthalten.

Ich muss eine Variable "number_of_sequences" hinzufügen, aber ich bin mir nicht sicher, wie man die Tensoren reorganisiert. Was sollte ich von meinem Code ändern? Ich bin etwas verloren mit den drei Dimensionen des X-Platzhalters, vielleicht so etwas?

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

Und auch mit dem Code der normalen Datenbank in eine Sequenz zu transformieren, vielleicht ?: diese

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

Vielen Dank im Voraus.

Antwort

1

ich Ihren Code bearbeiten, so dass Sie das Ergebnis erhalten, die Sie benötigen,

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) 

jetzt x ist eine Liste der Länge 30 * 60 und ein Element einer Liste ist in der Form von [batch_size 3 ]. Jetzt hat x die Form, die von der tf static_rnn-Methode benötigt wird.

Hoffe, das hilft.

+0

Danke! es funktionierte :) – DarkHawk

Verwandte Themen