2017-04-11 4 views
6

J'ai été donné quelques données de ce format et les détails suivants:Tensorflow dynamique RNN (LSTM): comment formater l'entrée?

person1, day1, feature1, feature2, ..., featureN, label 
person1, day2, feature1, feature2, ..., featureN, label 
... 
person1, dayN, feature1, feature2, ..., featureN, label 
person2, day1, feature1, feature2, ..., featureN, label 
person2, day2, feature1, feature2, ..., featureN, label 
... 
person2, dayN, feature1, feature2, ..., featureN, label 
... 
  • il y a toujours le même nombre de fonctionnalités, mais chaque fonction peut être un 0 représentant rien
  • il y a une quantité variable des jours disponibles pour chaque personne, p.ex. person1 a 20 jours de données, PERSON2 a 50

L'objectif est de prédire l'étiquette de la personne le lendemain, l'étiquette de Dayn + 1, soit sur une base par personne, ou globale (Par personne a plus de sens pour moi). Je peux reformater librement les données (ce n'est pas grand). Sur la base de ce qui précède, après une lecture je pensais un RNN dynamique (LSTM) pourrait travailler mieux:

  • réseau de neurones récurrents: car le lendemain repose la veille
  • LSTM: parce que le modèle construit avec chaque jour
  • dynamique: car toutes les fonctionnalités sont présentes chaque jour

Si elle n'a pas de sens pour les données que j'ai, s'il vous plaît me arrêter ici. La question est alors:

Comment donner/mettre en forme ces données pour tensorflow/tflearn?

J'ai regardé this par exemple en utilisant tflearn mais je ne comprends pas son format d'entrée pour que je puisse le "copier" au mien. De même, ont trouvé this poster sur une question très similaire mais il semble que les échantillons de l'affiche ne sont pas liés entre eux comme ils sont dans le mien. Mon expérience avec tensorflow est limitée à sa page get started.

Répondre

13

dynamique: car toutes les fonctionnalités sont présentes chaque jour

Vous avez le mauvais concept de dynamique ici. RNN dynamique dans Tensorflow signifie que le graphique est créé dynamiquement pendant l'exécution, mais les entrées sont toujours de la même taille (0 car l'absence d'une fonctionnalité devrait fonctionner).

De toute façon, ce que vous avez ici sont des séquences de longueur variable (jour1 ... jour?) De vecteurs de caractéristiques (feature1 ... featureN). Tout d'abord, vous avez besoin d'un LSTM cell

cell = tf.contrib.rnn.LSTMcell(size) 

de sorte que vous pouvez créer un graphique dynamique RNN à l'aide tf.nn.dynamic_rnn déroula. À partir des documents:

entrées: Les entrées RNN.

Si time_major == Faux (par défaut), il doit s'agir d'un Tenseur de forme: [taille_batch, heure_maximale, ...], ou un tuple imbriqué de tels éléments. Où max_time fait référence à la longueur de la séquence d'entrée.

Parce que nous utilisons dynamic_rnn, la longueur de la séquence n'a pas besoin d'être défini lors de la compilation, de sorte que votre espace réservé d'entrée pourrait être:

x = tf.placeholder(tf.float32, shape=(batch_size, None, N)) 

qui est ensuite introduit dans le RNN comme

outputs, state = tf.nn.dynamic_rnn(cell, x) 

Cela signifie que vos données d'entrée doivent avoir la forme (batch_size, seq_length, N). Si des exemples dans un lot ont une longueur variable, vous devez les tapis avec 0 vecteurs à la longueur maximum et passer le paramètre sequence_length approprié pour dynamic_rnn

Il est évident que j'ai sauté beaucoup de détails, de façon à bien comprendre RNNs vous devriez probablement lu l'un des nombreux excellents tutoriels RNN, comme this one par exemple.

+0

Comment créer un RNN lorsque la longueur des données d'entrée est arbitraire? –

+0

Si vous définissez la taille du lot par 'longueur des données d'entrée', vous pouvez déclarer x comme ayant la forme = (Aucun, Aucun, N) 'pour pouvoir transmettre des lots de longueur arbitraire. Si vous voulez dire la longueur de la séquence, alors c'est couvert dans ma réponse. – Dzjkb

+0

Merci, cependant, je ne pense pas que je peux tamponner les données d'entrée avec 0-vecteurs à la longueur maximale dans mon application. Comme à chaque pas de temps, il existe différentes données d'entrée de longueur différente. À mon avis, si le remplissage avec 0-vecteurs, le réseau peut obtenir des performances faibles parce que 0 a sa propre signification par exemple la position ou l'étiquette (un codage à chaud). –