2017-04-17 2 views
1

Je code rnn similaire à dynamic_rnn fourni par tensorflow. J'ai essayé de voir le code sur GitHub mais je n'arrive pas à comprendre comment ils l'ont implémenté. Je veux le construire à partir de zéro afin que je puisse personnaliser rnn de l'intérieur. Comment faire ça?Construction dynamic_rnn à partir de zéro dans tensorflow

Actuellement, mon approche pense à une série temporelle tronquée comme un tenseur utilise tf.scan() et trouve le nouvel état caché pour toutes les séries chronologiques. Utilisez ensuite tf.map_fn pour trouver la sortie des nouvelles variables cachées empilées. Enfin, utilisez tf.while_loop() pour trouver l'erreur de chaque tenseur sur la première dimension de la sortie empilée et effectuez une propagation arrière avec cette perte. Mon problème sera que le graphique soit dynamique après cela. Je veux dire disons d'abord que je me suis déroulé 5 fois puis 4 fois le graphique effacera-t-il qu'un nœud ait roulé avant?

Est-ce que cela fonctionnera?

S'il vous plaît guider.

Merci,

Répondre

0

RNNs devraient être implémentable avec une seule boucle (scan/map_fn/etc. Sont tous basés sur while_loop avec un ou plusieurs TensorArray s) qui passe l'état et calcule une perte tout en un. Un avantage de ces constructions est que votre graphe est de taille fixe mais le nombre d'itérations peut varier (ou être très grand sans augmenter la taille du graphe). Toutefois, l'itération sur des séquences de longueur variable n'est généralement pas idéale pour optimiser les performances. Généralement, tirer parti des instructions SIMD sur la CPU ou du parallélisme sur le GPU nécessite au moins un traitement par lots, auquel cas il est judicieux de découper vos séquences et de regrouper ces segments ensemble. Il existe des outils tels que SequenceQueueingStateSaver qui vous permettent de produire des lots de taille fixe à partir de nombreuses séquences de longueur variable.