2017-08-22 4 views
9

La forme de p_input dans this LSTM Autoencoder pour "test.py" est (128,8,1); ce qui signifie 128 ensembles de 8 chiffres. J'essaie d'adapter ce modèle à des données basées sur des séries temporelles avec 4 séries de 25 000 pas de temps (en gros 0 secondes à 25 000 secondes). J'ai essayé d'entrer cet ensemble de données dans p_input avec la forme (4,25000,1) et aucune erreur s'est produite. Cependant, lorsque j'exécute le script, au lieu d'obtenir iter 1: 0.01727, iter 2: 0.00983, ..., je ne reçois aucun commentaire imprimé du script, donc je suppose que quelque chose retarde le script. J'ai également essayé de simplement changer le batch_num en 4 et step_num en 25 000 directement sur le fichier "test.py" non édité et le même résultat sans retour d'information imprimé. Mes pensées sont que dans "test.py", p_inputs prend trop de temps pour calculer les opérations tf.split et tf.squeeze. Une autre pensée est que je pourrais avoir besoin d'augmenter le nombre d'unités cachées LSTM dans hidden_num et/ou augmenter le nombre d'époques (iteration). De plus, il se peut que le batch_num soit supérieur au step_num. J'ai essayé ceci avec "test.py" avec step_num = 4 et batch_num = 25000 et le manuscrit s'est exécuté normalement avec la rétroaction imprimée. Laissez-moi savoir ce que vous pensez du problème qui pourrait empêcher le fonctionnement du script.LSTM Autoencoder pas de progression lorsque le script s'exécute sur un jeu de données plus volumineux

Répondre

4

La deuxième dimension de votre entrée est le nombre de fois que le réseau est déroulé pour calculer les gradients par l'algorithme BPTT. L'idée est qu'un réseau récurrent (comme le LSTM) est transformé en un réseau de feedforward en "déroulant" chaque pas de temps en tant que nouvelle couche du réseau.

Lorsque vous fournissez la totalité de la série temporelle ensemble (c'est-à-dire 25 000 pas de temps), vous êtes en train de dérouler votre réseau 25 000 fois, vous obtiendrez ainsi un réseau feedforward déroulé avec 25 000 couches !! Donc, même si je ne sais pas pourquoi vous n'obtenez aucune erreur, le problème est probablement lié à un problème de OUT OF MEMORY. Vous n'êtes pas en mesure d'intégrer 25 000 variables de calques dans la mémoire.

Lorsque vous devez traiter des séries chronologiques longues, vous devez diviser vos données en segments (disons de 20 pas de temps). Vous fournissez un seul bloc par cycle. Ensuite, à chaque exécution suivante, vous devez restaurer l'état initial du réseau avec le dernier état de l'exécution précédente.

Je peux vous donner un exemple. Qu'est-ce que vous avez maintenant (je néglige la troisième dimension pour des raisons pratiques) est un 4x25000 de vecteur qui est en forme de quelque chose comme ceci:

--------------------- 25000---------------------- 
| 
| 
4 
| 
| 
-------------------------------------------------- 

Vous avez maintenant de le diviser en morceaux comme ceux-ci:

----20----- ----20----- ----20----- 
|   | |   | |   | 
|   | |   | |   | 
4   | 4   | 4   | [...] 
|   | |   | |   | 
|   | |   | |   | 
----------- ----------- ----------- 

Vous fournissez un seul tronçon de 4x20 à chaque fois. Ensuite, l'état final de votre LSTM après chaque mandrin doit être fourni en entrée avec le mandrin suivant.

Ainsi, votre feed_dict doit être quelque chose comme ceci:

feed_dict ={x: input_4_20}, 
      state.c = previous_state.c, 
      state.h=previous_state.h} 

Voir la LM tutorial de tensorflow pour un exemple sur la façon de fournir l'état d'un LSTM à la prochaine course.Tensorflow fournit une fonction pour ce faire automatiquement. Vérifiez le Tensorflow DevSummit Tutorial sur l'API RNN pour plus d'informations. J'ai lié la seconde exacte où les fonctions désirées sont expliquées. La fonction est la tf.contrib.training.batch_sequences_with_states(...)

En dernier conseil, je vous suggère de repenser à votre tâche. En fait, une série temporelle de 25 000 est une séquence vraiment LONGUE et je m'inquiète du fait qu'un même LSTM ne peut pas gérer des dépendances aussi anciennes. Ce que je veux dire c'est que lorsque vous traitez le 24000ème élément de la série, l'état LSTM a probablement tout oublié du 1er élément. Dans ces cas, essayez de regarder vos données pour voir quelle est l'échelle de vos phénomènes. Si vous n'avez pas besoin d'une granularité d'une seconde (c'est-à-dire que votre série est hautement redondante car les fonctionnalités ne changent pas très rapidement dans le temps), réduisez votre série pour avoir une séquence plus courte à gérer.

+0

Nous vous remercions de votre réponse. Les 25 000 pas de temps proviennent de l'interpolation et du choix du nombre de points. Je peux toujours le changer. Quel devrait être le nombre maximum de pas de temps? Aussi, je ne comprends pas très bien comment vous faites le découpage même après avoir lu tous vos liens. –

+0

J'ai édité la réponse. Dites-moi si c'est plus clair. Pour ce qui concerne le nombre maximum de pas de temps, cela dépend de vos besoins. LSTM est capable d'apprendre la dépendance qui est assez loin dans le passé, mais dans mon expérience, aller plus de 100 pas de temps n'est pas bon. Donc, en une seule entrée, ne dépassez pas les segments qui sont trop longs dans la dimension temporelle (garder 20-50 c'est mieux) –