2017-10-31 3 views
5

Ich habe mit langen sequentiellen Daten zu tun, die an einen RNN übergeben werden müssen. Gehen Sie abgeschnittene BPTT und Dosiersysteme, scheint, wie es gibt zwei Möglichkeiten:Wie funktioniert die API tf.contrib.training.batch_sequences_with_states von Tensorflow?

  1. eine Batch Erstellen von jeweiligen Segmente aus verschiedenen Sequenzen kombiniert. Behalten Sie den Endstatus jeder Sequenz in einem Stapel bei und übergeben Sie ihn an den nächsten Stapel.
  2. Betrachten Sie jede Sequenz als Mini-Batch, wobei Segmente aus der Sequenz zu Mitgliedern des Stapels werden. Bewahren Sie den Status des letzten Zeitschritts in einem Segment auf und übergeben Sie ihn an den ersten Zeitschritt des nächsten Segments.

Ich stieß auf tf.contrib.training.batch_sequences_with_states, die scheint, eine der beiden zu tun. Die Dokumentation ist für mich verwirrend und deshalb möchte ich sicher sein, auf welche Weise die Chargen generiert werden.

Meine Vermutung ist, dass es den ersten Weg macht. Wenn die Stapelverarbeitung auf die zweite Art ausgeführt wird, können wir die Vorteile der Vektorisierung nicht nutzen, da RNN einen Zustand zwischen dem letzten Zeitschritt eines Segments und dem ersten Zeitschritt des nächsten Segments beibehalten sollte, um den Zustand zu erhalten Token zu einer Zeit nacheinander.

Frage:

Welche dieser beiden batching Strategien in tf.contrib.training.batch_sequences_with_states umgesetzt werden?

Antwort

2

tf.contrib.training.batch_sequences_with_states implementiert das frühere Verhalten. Jeder Minibatch-Eintrag ist ein Segment aus einer anderen Sequenz (jede Sequenz, die aus einer variablen Anzahl von Segmenten bestehen kann, hat einen eindeutigen Schlüssel und dieser Schlüssel wird an batch_sequences_with_states übergeben). Bei der Verwendung mit state_saving_rnn wird der Endstatus für jedes Segment in einem speziellen Speichercontainer gespeichert, wodurch das nächste Segment der angegebenen Sequenz beim nächsten sess.run ausgeführt werden kann. Finalsegmente geben einen Minibatch-Slot für eine andere Sequenz frei.

Verwandte Themen