LSTM Autoencoder kein Fortschritt, wenn das Skript auf einem größeren Dataset ausgeführt wird

9

Die Form von p_input in diesem LSTM-Autoencoder für "test.py " ist (128,8,1); Bedeutung 128 Sätze von 8 Ziffern. Ich versuche, dieses Modell auf Zeitreihen basierte Daten mit 4 Sätzen von 25.000 Zeitschritten (im Grunde 0 Sekunden bis 25.000 Sekunden) anzupassen. Ich habe versucht, diesen Datensatz in p_input mit der Form (4,25000,1) einzugeben und es sind keine Fehler aufgetreten. Wenn ich jedoch das Skript ausführe, bekomme ich, anstatt iter 1: 0.01727, iter 2: 0.00983, ... zu erhalten, keine gedruckte Rückmeldung vom Skript, also nehme ich an, dass etwas das Skript hochhält. Ich habe auch versucht, nur die batch_num zu 4 und step_num zu 25.000 direkt auf die unbearbeitete "test.py" -Datei zu ändern und das gleiche Ergebnis von keine gedruckte Rückmeldung aufgetreten.

Meine Gedanken sind, dass in "test.py" p_inputs zu lange dauert, um die Operationen tf.split und tf.squeeze zu berechnen. Ein anderer Gedanke ist, dass ich die Anzahl der versteckten LSTM-Einheiten in hidden_num erhöhen und / oder die Anzahl der Epochen erhöhen muss ( iteration ). Darüber hinaus könnte es sein, dass batch_num größer sein muss als step_num . Ich habe dies mit "test.py" mit step_num = 4 und batch_num = 25000 versucht und das Skript lief normal mit gedruckter Rückmeldung.

Lassen Sie mich wissen, was das Problem sein könnte, wenn Sie das Ausführen des Skripts verhindern.

    
Julian Rachman 22.08.2017, 02:02
quelle

1 Antwort

4

Die zweite Dimension Ihrer Eingabe ist die Häufigkeit, mit der das Netzwerk zum Berechnen von Gradienten durch den BPTT -Algorithmus entrollt wird.

Die Idee ist, dass ein wiederkehrendes Netzwerk (wie das LSTM) in ein Feedforward-Netzwerk umgewandelt wird, indem jedes Mal als neue Schicht des Netzwerks "entrollt" wird.

Wenn Sie die gesamte Zeitreihe zusammen bereitstellen (d. h. 25000 Zeitschritte), rollen Sie Ihr Netzwerk 25000 Mal ab, dh Sie erhalten ein aufgerolltes Feedforward-Netzwerk mit 25000 Layern !!

Also, obwohl ich nicht weiß, warum Sie keinen Fehler bekommen, hängt das Problem wahrscheinlich mit einem OUT-OF-MEMORY-Problem zusammen. Sie können keine 25000-Layer-Variablen in den Speicher einfügen.

Wenn Sie mit langen Zeitreihen fertig werden müssen, müssen Sie Ihre Daten in Stücke zerlegen (sagen wir mal 20 Zeitschritte). Sie stellen einen einzelnen Chunk pro Lauf zur Verfügung. Anschließend müssen Sie bei jedem folgenden Lauf den Anfangszustand des Netzwerks mit dem letzten Status des vorherigen Laufs wiederherstellen.

Ich kann Ihnen ein Beispiel geben. Was Sie jetzt haben (ich vernachlässige die dritte Dimension aus praktischen Gründen), ist ein Vektor 4x25000, der in etwa so aussieht:

%Vor%

Sie müssen es nun in folgende Teile aufteilen:

%Vor%

Sie stellen jedes Mal einen einzelnen Chunck von 4x20 zur Verfügung. Dann muss der Endzustand Ihres LSTM nach jedem Chuck als Eingabe mit dem nächsten Chuck bereitgestellt werden.

Ihr feed_dict muss also etwa so aussehen:

%Vor%

Im LM-Lernprogramm von Tensorflow finden Sie ein Beispiel für die Bereitstellung des Status eines LSTM für den nächsten Lauf.

Tensorflow bietet einige Funktionen, um dies automatisch zu tun. Weitere Informationen finden Sie im Tensorflow DevSummit-Lernprogramm auf der RNN-API. Ich habe genau die Sekunde verbunden, wo die gewünschten Funktionen erklärt werden. Die Funktion ist tf.contrib.training.batch_sequences_with_states(...)

Als letzten Ratschlag würde ich Ihnen vorschlagen, Ihre Aufgabe zu überdenken. Tatsächlich ist eine Zeitreihe von 25000 eine wirklich lange Sequenz und ich bin besorgt darüber, dass selbst ein LSTM so lange vergangene Abhängigkeiten nicht bewältigen kann. Was ich meine ist, dass, wenn Sie das 24000. Element der Serie bearbeiten, der LSTM-Zustand wahrscheinlich alles über das 1. Element vergessen hat. Versuchen Sie in diesen Fällen, Ihre Daten zu betrachten, um zu sehen, welches der Maßstab für Ihre Phänomene ist. Wenn Sie keine Granularität einer einzelnen Sekunde benötigen (d. H. Ihre Serie ist hochgradig redundant, da sich Merkmale nicht sehr schnell ändern), reduzieren Sie Ihre Serie, um eine kürzere Sequenz zu verwalten.

    
Giuseppe Marra 24.08.2017, 08:15
quelle