2016-02-17 8 views
5

Ich habe gerade angefangen mit TensorFlow zu spielen und ich versuche eine sehr einfache RNN zu implementieren. Die RNN hat x als Eingabe, y als Ausgabe und besteht aus nur einer einzigen Schicht, die x und ihre vorherige Ausgabe als Eingabe dauert. Hier ist ein Bild von der Art der Sache, die ich im Sinne habe:Wie man eine einfache RNN mit einem Zyklus in der Grafik in TensorFlow baut?

A simple RNN

Das Problem ist, ich kann nicht sehen, jede Art und Weise durch die TensorFlow API ein Diagramm mit einem Zyklus darin zu konstruieren. Immer wenn ich einen Tensor definiere, muss ich spezifizieren, was seine Eingaben sind, was bedeutet, dass ich seine Eingaben bereits definiert haben muss. Es gibt also ein Henne-und-Ei-Problem.

Ich weiß nicht einmal, ob es sinnvoll ist, einen Graphen mit einem Zyklus zu definieren (Was wird zuerst berechnet? Müsste ich einen Anfangswert des Softmax-Knotens definieren?). Ich spielte mit der Idee, eine Variable zu verwenden, um die vorherige Ausgabe darzustellen, und dann manuell den Wert y zu nehmen und ihn jedes Mal nach dem Durchlaufen einer Trainingsprobe in der Variablen zu speichern. Aber das wäre sehr langsam, es sei denn, es gibt eine Möglichkeit, diese Prozedur im Diagramm selbst darzustellen (?).

Ich weiß, dass die TensorFlow-Tutorials Beispielimplementierungen von RNNs zeigen, aber sie betrügen und ziehen ein LSTM-Modul aus der Bibliothek heraus, in der sich bereits der Zyklus befindet. Insgesamt sind die Tutorials gut dafür geeignet, bestimmte Dinge zu bauen, aber sie könnten besser erklären, wie dieses Biest wirklich funktioniert.

Also, TensorFlow-Experten, gibt es eine Möglichkeit, dieses Ding zu bauen? Wie würde ich es machen?

+0

Ihre Variable Idee scheint wie ein Weg zu gehen, sollte nicht langsam sein, wenn Sie TensorFlow Variablen/assign ops verwenden –

+0

Aber ich würde 'sess.run (y_prev.assign (y))' nicht aufrufen und ausführen die Proben durch eins nach dem anderen? Oder meinst du, ich sollte das mit der von @Ishamael beschriebenen Abrolltaktik kombinieren? – Shum

Antwort

2

Tatsächlich gehen sowohl der Vorwärts- als auch der Rückwärtsdurchlauf in allen Maschinenlern-Frameworks davon aus, dass Ihr Netzwerk keine Zyklen hat. Eine übliche Art, ein wiederkehrendes Netzwerk zu implementieren, besteht darin, es für mehrere Schritte (z. B. 50) zu entrollen und daher ein Netzwerk, das Schleifen aufweist, in ein Netzwerk umzuwandeln, das keine hat.

Zum Beispiel in der Dokumentation zu beziehen Sie sich:

https://www.tensorflow.org/versions/r0.7/tutorials/recurrent/index.html

Sie erwähnen

Um den Lernprozess handhabbar zu machen, ist es übliche Praxis, die Gradienten trunkieren für die Rückpropagierung auf eine feste Anzahl (num_steps) von ungerollten Schritten.

Was es bedeutet, effektiv ist, dass sie num_steps LSTM Zellen geschaffen werden, wobei jeder als einen Eingang für den aktuellen Zeitschritt der Wert x nimmt, und die Ausgabe des vorherigen LSTM Modul.

Die BasicLSTMCell, die sie verwenden und die Sie denken, hat eine Schleife in der Tat keine Schleife. Eine LSTM-Zelle ist nur eine Implementierung eines einzelnen LSTM-Schritts (ein Block mit zwei Eingängen [Eingang und Speicher] und zwei Ausgängen [Ausgang und Speicher] und verwendet Gatter zur Berechnung der Ausgänge von Eingängen), nicht das gesamte LSTM-Netzwerk.

Verwandte Themen