2016-03-26 7 views

Antwort

3

Die Zelle callable ist eine Funktion, die einen Eingang tf.Tensor und den aktuellen Zustand als tf.Tensor, und liefert einen Ausgang tf.Tensor und den neuen Zustand als tf.Tensor nimmt. Es gibt nichts besonderes an den Eingangs-/Ausgangs- und Zustandstensors: Diese können aus den Eingängen zu anderen TensorFlow-Operationen berechnet und/oder verwendet werden.

Ein Beispiel sehen Sie die ptb_word_lm.py Modell:

for time_step in range(num_steps): 
    # ... 
    (cell_output, state) = cell(inputs[:, time_step, :], state) 
    outputs.append(cell_output) 

Hier ist inputs ein 3-D-Tensor, aus dem ein Stück genommen wird, um die Eingabe für eine Zelle des LSTM zu bekommen, und state ist initially berechnet mit cell.zero_state(), dann verwendet jede nachfolgende Iteration den Zustand der vorherigen Iteration.

Der inputs Tensor ist der result eines tf.nn.embedding_lookup() Vorgangs; Die outputs Liste ist later concatenated und wird als Eingabe für eine Verlustberechnung verwendet. TensorFlow backprops vom Verlust durch den RNN und dem Einbettungsnachschlagen zurück zu den Modellvariablen.

+0

Ich denke, dass die Methode, die Sie beschreiben, den Nachteil hat, dass wenn das num_steps sehr groß ist, das Diagramm viel Zeit und Speicher benötigt, um initialisiert zu werden. Auch wenn Sie nicht von Anfang an die Länge der Zeitreihe kennen (d. H. Streaming-Daten), die Ihr Netzwerk verarbeitet, wäre es nutzlos. Korrigiere mich, wenn ich falsch liege –

+0

Ja, in einigen dieser Fälle solltest du ['tf.nn.dynamic_rnn()'] (https://www.tensorflow.org/versions/r0.9/api_docs/python/nn .html # dynamic_rnn), die die Schleife nicht abrollt. Derzeit gibt es keine Bibliotheksmethode für die Verarbeitung von Streaming-Daten, aber die ursprüngliche Frage hatte diese Anforderung nicht. Für das Streaming von Daten können Sie etwas mit 'tf.while_loop()' implementieren, aber die aktuelle Implementierung ist effizienter, wenn Sie die maximale Anzahl von Zeitschritten im Voraus kennen. – mrry

Verwandte Themen