2016-03-28 6 views
0

Ich bin verwirrt über die Lebensdauer von Tensoren/ops/Variablen innerhalb der Standardgrafik.Graph Nutzungsmuster für RNNs

In RNNs wird die Graphenstruktur bei jeder Iteration ändern aufgrund der variablen Länge der Eingabedaten. Sollten separate Graphen daher bei jeder Iteration des Trainings erstellt/zerstört werden, um der sich ändernden Struktur des Graphen Rechnung zu tragen, oder gibt es eine Möglichkeit, bei dem Standardgraphen zu bleiben?

Auch wenn neue Graphen aufgebaut sind, wie können sie Variablen teilen?

Antwort

1

Für RNNs Insbesondere gibt es zwei Möglichkeiten: tf.nn.rnn und tf.nn.dynamic_rnn. Keiner erstellt oder zerstört Grafiken vorübergehend.

Die erste Funktion erzeugt T Subgraphen, in dem T die Länge der Liste der Python Eingänge Sie liefern (das heißt, ist ein Len Eingänge T Python Liste der Form [batch, depth] Tensoren). tf.nn.rnn erwartet immer eine feste Anzahl von Zeitschritten. Hinweis: Sie können steuern, welche Untergraphen für einen bestimmten Schritt ausgeführt werden, indem Sie den Parameter sequence_length übergeben; Die Funktion verwendet dann eine bedingte Auswertung (tf.cond), um festzustellen, welche Operationen ausgeführt werden.

Im Gegensatz dazu verwendet dynamic_rnn eine spezielle TensorFlow while-Schleife und andere Tricks, die eine begrenzte Art von Schleife in der Graphenstruktur einführt. In diesem Fall gibt es genau einen Untergraphen für den "Zeitschritt" und er wird immer wieder durchlaufen, bis Ihre Eingabe verarbeitet wurde. In diesem Fall ist die Eingabe ein 3D Tensor mit den Abmessungen [batch, time, depth] (es [time, batch, depth] sein kann, wenn Sie time_major=True gesetzt); und die ersten zwei Dimensionen können von Schritt zu Schritt variieren.