2017-10-13 10 views
2

Je suis confronté à des doutes en essayant d'implémenter LSTM avec plusieurs séquences d'entrée (multivariées) sous Tensorflow.Entrée multivariée pour LSTM dans tensorflow

I défini le LSTM ainsi:

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'] 

et les tenseurs de données sont définies ainsi:

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

qui est convenable pour une entrée de dimension avec une longueur connue. Je vais vous donner un exemple simple: Vous avez le taux de pluie mesuré toutes les secondes, donc vous avez une série chronologique de taille N. Vous voulez prévoir le taux de pluie 30 minutes à l'avance afin que vous divisiez les données en segments toutes les 30 minutes. Ainsi, vous devez alimenter le LSTM avec une entrée de 30 (minutes) * 60 (une par seconde) mesures, et la sortie sera le taux de pluie après 30 minutes de la dernière entrée donnée (une mesure).

Jusqu'à ici, le problème est résolu avec ce modèle simple, mais que dois-je faire pour ajouter une autre entrée? Ce serait, au lieu d'utiliser seulement le taux de pluie pour se prévoir après 30 minutes, également nourrir le LSTM avec, par exemple, le taux d'humidité et la vitesse du vent chaque seconde. Ce serait un LSTM avec 3 séquences comme entrées, et chacune de ces entrées contiendrait 30 minutes * 60 mesures.

J'ai besoin d'ajouter une variable "number_of_sequences" mais je ne sais pas comment réorganiser les tenseurs. Que devrais-je changer à partir de mon code? Je suis un peu perdu avec les trois dimensions de l'espace réservé X, peut-être quelque chose comme ça?

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

Et avec le code pour transformer la base de données normale en une séquence, peut-être cette ?:

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

Merci à l'avance.

Répondre

1

J'ai modifié votre code afin que vous puissiez obtenir le résultat que vous avez besoin,

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) 

maintenant x est une liste de longueur 30 * 60 et un élément d'une liste est en forme de [batch_size 3 ] Maintenant, x a la forme requise par la méthode static_rnn.

Espérons que cela aide.

+0

Merci! ça a marché :) – DarkHawk