Analyse der Ausgabe von tf.nn.dynamic_rnn Tensorflow-Funktion

8

Ich kann die Ausgabe von tf.nn.dynamic_rnn tensorflow-Funktion nicht verstehen. Das Dokument sagt nur über die Größe der Ausgabe aus, aber es sagt nicht, was jede Zeile / Spalte bedeutet. Aus der Dokumentation:

  

Ausgaben : Die RNN-Ausgabe Tensor .

     

Wenn time_major == False (Standard), ist dies ein Tensor shaped:        [batch_size, max_time, cell.output_size] .

     

Wenn time_major == True, ist dies ein Tensor shaped:        [max_time, batch_size, cell.output_size] .

     

Beachten Sie, wenn cell.output_size ein (möglicherweise verschachteltes) Tupel von ganzen Zahlen ist   oder TensorShape Objekte, dann wird outputs ein Tupel mit dem
sein   gleiche Struktur wie cell.output_size , enthält Tensoren mit Shapes   entsprechend den Formdaten in cell.output_size .

     

state : Der Endstatus. Wenn cell.state_size ein int ist, wird dies   sei geformt [batch_size, cell.state_size] . Wenn es sich um ein
TensorShape handelt, wird dies [batch_size] + cell.state_size geprägt.
  Wenn es ein (möglicherweise verschachteltes) Tupel von Ints oder TensorShape ist, wird dies der Fall sein   Sei ein Tupel mit den entsprechenden Formen.

Der outputs Tensor ist eine 3-D Matrix, aber was repräsentiert jede Zeile / Spalte?

    
Mithun 24.05.2017, 15:15
quelle

1 Antwort

16

tf.dynamic_rnn bietet zwei Ausgaben, outputs und state .

  • outputs enthält die Ausgabe der RNN-Zelle zu jedem Zeitpunkt. Nimmt man den Standardwert time_major == False an, nehmen wir an, dass Sie eine Eingabe aus 10 Beispielen mit jeweils 7 Zeitschritten und einem Merkmalsvektor der Größe 5 für jeden Zeitschritt haben. Dann wäre Ihre Eingabe 10x7x5 ( batch_size x max_time x features ). Jetzt geben Sie dies als eine Eingabe für eine RNN-Zelle mit Ausgabegröße 15. Konzeptionell wird jeder Zeitschritt jedes Beispiels in die RNN eingegeben, und Sie würden einen 15-langen Vektor für jede davon erhalten. Also das ist, was outputs enthält, ein Tensor in diesem Fall der Größe 10x7x15 ( batch_size x max_time x cell.output_size ) mit der Ausgabe der RNN-Zelle bei jedem Zeitschritt. Wenn Sie nur an der letzten Ausgabe der Zelle interessiert sind, können Sie einfach die Zeitdimension aufteilen, um nur das letzte Element auszuwählen (z. B. outputs[:, -1, :] ).
  • state enthält den Zustand des RNN nach der Verarbeitung aller Eingaben. Beachten Sie, dass im Gegensatz zu outputs nicht zu jedem Zeitschritt Informationen enthalten sind, sondern nur zum letzten (dh zum Status nach dem letzten). Abhängig von Ihrem Fall kann der Zustand nützlich sein oder auch nicht. Wenn Sie beispielsweise sehr lange Sequenzen haben, möchten / wollen Sie möglicherweise nicht, dass Sie sie in einem einzigen Stapel verarbeiten können, und Sie müssen sie möglicherweise in mehrere Untersequenzen aufteilen. Wenn Sie state ignorieren, wird es immer so, als ob Sie eine neue Subsequenz eingeben, als würden Sie eine neue Subsequenz erstellen. Wenn Sie sich jedoch an den Zustand erinnern (z. B. ihn ausgeben oder in einer Variablen speichern), können Sie ihn später zurückgeben (über den Parameter initial_state von tf.nn.dynamic_rnn ), um den Zustand des RNN korrekt zu verfolgen. und setze es nur auf den Anfangszustand (im Allgemeinen nur Nullen) zurück, nachdem du die ganzen Sequenzen abgeschlossen hast. Die Form von state kann abhängig von der von Ihnen verwendeten RNN-Zelle variieren, im Allgemeinen haben Sie jedoch für jedes Beispiel einen Zustand (einen oder mehrere Tensoren mit der Größe batch_size x state_size , wobei state_size hängt vom Zelltyp und von der Größe ab).
jdehesa 24.05.2017, 15:47
quelle

Tags und Links