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?
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 appeleztf.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 untf.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.
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ètretime_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 decell.output_size
.
Pour plus de détails, explorez source .