Ich lese alle möglichen Texte darüber, und niemand scheint diese grundlegende Frage zu beantworten. Es ist immer mehrdeutig:
In einer stateful = False
LSTM-Ebene setzt keras Zustände nach:
Angenommen, ich habe X_train als (1000,20,1) geformt, was 1000 Sequenzen von 20 Schritten eines einzelnen Wertes bedeutet. Wenn ich mache:
%Vor% Wird es Zustände für jede einzelne Sequenz zurücksetzen (setzt Zustände 1000 Mal zurück)?
Oder setzt es Zustände für jeden Stapel zurück (setzt Zustände 5 mal zurück)?
Bei einigen Tests kam ich zu folgendem Ergebnis, das der Dokumentation und Nassims Antwort entspricht:
Erstens gibt es in einer Schicht keinen einzelnen Zustand, sondern einen Zustand pro Probe im Stapel. Es gibt batch_size
parallele Zustände in einer solchen Schicht.
In einem Fall stateful=False
werden alle Zustände nach jedem Stapel zusammen zurückgesetzt .
Ein Stapel mit 10 sequences
würde 10 states
erstellen, und alle 10 Zustände werden nach der Verarbeitung automatisch zurückgesetzt.
Der nächste Stapel mit 10 sequences
erstellt 10 new states
, das nach der Verarbeitung dieses Stapels ebenfalls zurückgesetzt wird
Wenn alle diese Sequenzen length (timesteps) = 7
haben, ist das praktische Ergebnis dieser beiden Stapel:
20 einzelne Sequenzen mit jeweils Länge 7
Keine der Sequenzen ist verwandt. Aber natürlich: Die Gewichte (nicht die Zustände) sind für die Ebene einzigartig und repräsentieren, was die Ebene von allen Sequenzen gelernt hat.
In diesem Fall gibt es auch die gleiche Anzahl von parallelen Zuständen, aber sie werden überhaupt nicht zurückgesetzt .
Ein Stapel mit 10 sequences
erstellt 10 states
, die am Ende des Stapels unverändert bleiben.
Der nächste Batch mit 10 sequences
(es müssen 10 sein, da der erste 10 war) wiederverwendet dieselben 10 states
, die zuvor erstellt wurden.
Das praktische Ergebnis ist: Die 10 Sequenzen in der zweiten Charge setzen die 10 Sequenzen der ersten Charge so fort, als ob es überhaupt keine Unterbrechung gegeben hätte.
Wenn jede Sequenz length (timesteps) = 7
hat, dann ist die tatsächliche Bedeutung:
10 einzelne Sequenzen mit jeweils 14
Wenn Sie sehen, dass Sie die Gesamtlänge der Sequenzen erreicht haben, rufen Sie model.reset_states()
auf, was bedeutet, dass Sie die vorherigen Sequenzen nicht mehr fortsetzen werden, jetzt werden Sie neue Sequenzen füttern.
Im Dokument des RNN-Codes können Sie dies lesen :
Hinweis zur Verwendung von Status in RNNs:
Sie können RNN-Layer als 'stateful' festlegen, was bedeutet, dass die Zustände berechnet für die Proben in einer Charge werden als Anfangszustände wiederverwendet für die Proben in der nächsten Charge. Dies setzt ein Eins-zu-eins-Mapping voraus zwischen Proben in verschiedenen aufeinanderfolgenden Chargen.
Ich weiß, dass dies Ihre Frage nicht direkt beantwortet, aber für mich bestätigt es, was ich dachte: Wenn ein LSTM nicht zustandsbehaftet ist, wird der Zustand nach jeder Probe zurückgesetzt. Sie arbeiten nicht nach Chargen, die Idee in einem Batch ist, dass jede Probe unabhängig voneinander ist.
Sie haben also 1000 für den Status des Standorts zurückgesetzt.
In Keras gibt es zwei Modi, um Zustände zu erhalten:
1) Der Standardmodus (stateful = False)
, bei dem der Status nach jedem Batch zurückgesetzt wird. AFAIK der Zustand wird weiterhin zwischen verschiedenen Proben innerhalb einer Charge beibehalten. Also würde dein Beispiel-Zustand in jeder Epoche 5 mal zurückgesetzt werden.
2) Der Stateful-Modus, in dem der Status nie zurückgesetzt wird. Es liegt an dem Benutzer, den Zustand vor einer neuen Epoche zurückzusetzen, aber Keras selbst wird den Zustand nicht zurücksetzen. In diesem Modus wird der Zustand von der Probe "i" einer Charge auf die Probe "i" der nächsten Charge übertragen. Im Allgemeinen wird empfohlen, den Status nach jeder Epoche zurückzusetzen, da der Zustand zu lange wachsen und instabil werden kann. Nach meiner Erfahrung mit kleinen Datensätzen (20.000-40.000 Samples) macht das Zurücksetzen oder Nicht-Zurücksetzen des Zustands nach einer Epoche für das Endergebnis keinen großen Unterschied. Für größere Datensätze kann es einen Unterschied machen.
Das statusbehaftete Modell ist nützlich, wenn Sie Muster mit mehr als 100 Zeitschritten haben. Andernfalls ist der Standardmodus ausreichend. Nach meiner Erfahrung hilft es auch, wenn die Batchgröße ungefähr der Größe (Zeitschritte) der Muster in den Daten entspricht.
Die zustandsorientierte Aufstellung könnte anfangs ziemlich schwer zu verstehen sein. Man würde erwarten, dass der Zustand zwischen der letzten Probe einer Charge und der ersten Probe der nächsten Charge übertragen wird. Aber der Zustand wird tatsächlich über Chargen zwischen denselben nummerierten Proben verbreitet. Die Autoren hatten zwei Möglichkeiten und sie wählten die letzteren. Lesen Sie hier hier . Sehen Sie sich auch die relevanten Keras FAQ im Abschnitt zu Stateful RNNs an.
Erweiternd auf @ Nassim_Bens Antwort ist es wahr, dass jede Sequenz für jede Instanz des Stapels als unabhängig betrachtet wird. Beachten Sie jedoch, dass der verborgene Zustand und der Zellenspeicher des RNN für 20 Schritte zur nächsten Zelle weitergeleitet werden. Der verborgene Zustand und der Zellenspeicher werden typischerweise für die allererste Zelle in den 20 Zellen auf Null gesetzt.
Nach der 20. Zelle und nachdem der versteckte Zustand (nur der Zellenspeicher) auf die Schichten über dem RNN übertragen wurde, wird der Zustand zurückgesetzt. Ich gehe davon aus, dass sie hier Zellgedächtnis und versteckten Zustand meinen.
Also ja, es wird für alle 1000 Instanzen zurückgesetzt, wenn man bedenkt, dass Ihre batch_size=200
5 mal zurückgesetzt wird, wird jede Charge zurückgesetzt, nachdem sie die Informationen durch diese 20 Schritte weitergegeben haben. Hoffentlich hast du das verstanden.
Hier ist nach Zelle 11. Ich habe immer Buchstaben angehängt, weil der Zustand sonst zurückgesetzt wurde.
Tags und Links lstm keras keras-layer