web-dev-qa-db-fra.com

Quelle est la différence entre tensorflow dynamic_rnn et rnn?

Il existe plusieurs classes dans tf.nn qui concernent les RNN. Dans les exemples que je trouve sur le Web, tf.nn.dynamic_rnn et tf.nn.rnn semble être utilisé de manière interchangeable ou du moins je n'arrive pas à comprendre pourquoi l'un est utilisé à la place de l'autre. Quelle est la différence?

31
Mad Wombat

From RNNs in Tensorflow, a Practical Guide and Undocumented Features par Denny Britz, publié le 21 août 2016.

tf.nn.rnn crée un graphique déroulé pour une longueur RNN fixe. Cela signifie que si vous appelez tf.nn.rnn avec des entrées ayant 200 pas de temps, vous créez un graphe statique avec 200 pas RNN. Tout d'abord, la création de graphiques est lente. Deuxièmement, vous ne pouvez pas transmettre des séquences plus longues (> 200) que celles que vous avez spécifiées à l'origine.

tf.nn.dynamic_rnn résout ce problème. Il utilise un tf.While boucle pour construire dynamiquement le graphe lors de son exécution. Cela signifie que la création de graphiques est plus rapide et vous pouvez alimenter des lots de taille variable.

48
Abhishek Mishra

Ils sont presque les mêmes, mais il y a une petite différence dans la structure des entrées et des sorties. De la documentation:

tf.nn.dynamic_rnn

Cette fonction est fonctionnellement identique à la fonction rnn ci-dessus, mais> effectue un déroulement entièrement dynamique des entrées.

Contrairement à rnn, les entrées d'entrée ne sont pas une Python de tenseurs, une pour chaque trame. Au lieu de cela, les entrées peuvent être un seul tenseur où la durée maximale est soit la première ou deuxième dimension (voir le paramètre time_major). Alternativement, il peut s'agir d'un tuple de tenseurs (éventuellement imbriqué), chacun d'eux ayant des dimensions de lot et de temps correspondantes. La sortie correspondante est soit un tenseur unique ayant le même nombre de pas de temps et de taille de lot, soit un tuple (éventuellement imbriqué) de ces tenseurs, correspondant à la structure imbriquée de cell.output_size.

Pour plus de détails, explorez source .

2
Dmitriy Danevskiy