Ich benutze das LSTM-Netzwerk in Keras. Während des Trainings schwankt der Verlust stark und ich verstehe nicht, warum das passieren würde.
Hier ist das NN, das ich ursprünglich verwendet habe:
Und hier sind der Verlust und die Genauigkeit während des Trainings:
(Beachten Sie, dass die Genauigkeit letztendlich tatsächlich 100% erreicht, aber ungefähr 800 Epochen dauert.)
Ich dachte, dass diese Schwankungen aufgrund von Dropout-Ebenen / Änderungen in der Lernrate auftreten (ich habe rmsprop / adam verwendet), also habe ich ein einfacheres Modell erstellt:
Ich habe auch SGD ohne Schwung und Verfall verwendet. Ich habe verschiedene Werte für ausprobiert, lr
aber immer noch das gleiche Ergebnis erzielt.
sgd = optimizers.SGD(lr=0.001, momentum=0.0, decay=0.0, nesterov=False)
Aber ich hatte immer noch das gleiche Problem: Der Verlust schwankte, anstatt nur abzunehmen. Ich habe immer gedacht, dass der Verlust nur allmählich sinken soll, aber hier scheint er sich nicht so zu verhalten.
Damit:
Ist es normal, dass der Verlust während des Trainings so schwankt? Und warum sollte es passieren?
Wenn nicht, warum sollte dies für das einfache LSTM-Modell passieren, dessen
lr
Parameter auf einen wirklich kleinen Wert eingestellt sind?
Vielen Dank. (Bitte beachten Sie, dass ich hier ähnliche Fragen geprüft habe, aber es hat mir nicht geholfen, mein Problem zu lösen.)
Aktualisierung: Verlust für mehr als 1000 Epochen (keine BatchNormalization-Schicht, Keras 'Unmodifikator RmsProp):
Upd. 2: Für das endgültige Diagramm:
model.compile(loss='categorical_crossentropy', optimizer='rmsprop', metrics=['accuracy'])
history = model.fit(train_x, train_y, epochs = 1500)
Daten: Folgen von Stromwerten (von den Sensoren eines Roboters).
Zielvariablen: Die Oberfläche, auf der der Roboter arbeitet (als One-Hot-Vektor, 6 verschiedene Kategorien).
Vorverarbeitung:
- hat die Abtastfrequenz geändert, damit die Sequenzen nicht zu lang sind (LSTM scheint nichts anderes zu lernen);
- Schneiden Sie die Sequenzen in die kleineren Sequenzen (die gleiche Länge für alle kleineren Sequenzen: jeweils 100 Zeitschritte);
- Überprüfen Sie, ob jede der 6 Klassen ungefähr die gleiche Anzahl von Beispielen im Trainingssatz enthält.
Keine Polsterung.
Form des Trainingssatzes (# Sequenzen, # Zeitschritte in einer Sequenz, # Merkmale):
(98, 100, 1)
Form der entsprechenden Beschriftungen (als One-Hot-Vektor für 6 Kategorien):
(98, 6)
Schichten:
Die restlichen Parameter (Lernrate, Stapelgröße) entsprechen den Standardeinstellungen in Keras:
keras.optimizers.RMSprop(lr=0.001, rho=0.9, epsilon=None, decay=0.0)
batch_size: Integer oder None. Anzahl der Proben pro Gradientenaktualisierung. Wenn nicht angegeben, wird standardmäßig 32 verwendet.
Upd. 3:
Der Verlust für batch_size=4
:
Denn batch_size=2
das LSTM schien nicht richtig zu lernen (Verlust schwankt um den gleichen Wert und nimmt nicht ab).
Upd. 4: Um zu sehen, ob das Problem nicht nur ein Fehler im Code ist: Ich habe ein künstliches Beispiel gemacht (2 Klassen, die nicht schwer zu klassifizieren sind: cos vs arccos). Verlust und Genauigkeit während des Trainings für diese Beispiele: