Ich versuche, etwas über RNNs zu lernen und verwende Keras. Ich verstehe die Grundvoraussetzung von Vanille-RNN- und LSTM-Schichten, habe jedoch Probleme, einen bestimmten technischen Punkt für das Training zu verstehen.
In der Keras-Dokumentation heißt es, dass die Eingabe in eine RNN-Ebene eine Form haben muss (batch_size, timesteps, input_dim)
. Dies legt nahe, dass alle Trainingsbeispiele eine feste Sequenzlänge haben, nämlich timesteps
.
Aber das ist nicht besonders typisch, oder? Ich möchte vielleicht, dass die RNN Sätze unterschiedlicher Länge bearbeitet. Wenn ich es auf einem Korpus trainiere, füttere ich es mit Sätzen unterschiedlicher Länge.
Ich nehme an, es wäre naheliegend, die maximale Länge einer Sequenz im Trainingsset zu finden und sie mit einem Null-Pad zu versehen. Aber heißt das dann, dass ich zum Zeitpunkt des Tests keine Vorhersagen mit einer längeren Eingabe machen kann?
Ich nehme an, dies ist eine Frage zur speziellen Implementierung von Keras, aber ich frage mich auch, was die Leute normalerweise tun, wenn sie mit solchen Problemen im Allgemeinen konfrontiert werden.
Masking
padding und setze die Ebene auf ignorAntworten:
Das ist nicht ganz richtig, da diese Dimension
None
variabel sein kann. Innerhalb einer einzelnen Charge , müssen Sie die gleiche Anzahl von Zeitschritten haben (dies in der Regel ist , wo Sie sehen 0-Polster und Maskierung). Zwischen den Chargen gibt es jedoch keine solche Einschränkung. Während der Inferenz können Sie eine beliebige Länge haben.Beispielcode, der zufällige zeitlange Stapel von Trainingsdaten erstellt.
Und das druckt es. Beachten Sie, dass die Ausgabeformen eine
(None, None, x)
variable Stapelgröße und eine variable Zeitschrittgröße anzeigen.quelle
fit()
können wir densequence_lenth
Parameter übergeben, um die Länge der Sequenz anzugeben, die ausgeschlossen werden soll. Es scheint, dass der Generator-Ansatz das Ignorieren von 0-Sequenzen nicht zulässt?(inputs, targets, sample_weights)
, und Sie könnensample_weights
Ihre 0-Pads auf 0 setzen. Ich bin jedoch nicht sicher, ob dies für bidirektionale RNNs perfekt funktionieren würde.model.predict_generator
mit einem Test-Set enthalten. Wenn ich versuche, mit einem Generator eine Vorhersage zu treffen, erhalte ich eine Fehlermeldung bezüglich der Verkettung (der Testsatz enthält auch Sequenzen mit variabler Länge). Meine Lösung bestand darin, den Standardmodel.predict
auf hackige Weise zu verwenden. Wäre das vielleicht besser für eine neue Frage?@kbrose scheint eine bessere Lösung zu haben
Dies ist normalerweise eine gute Lösung. Versuchen Sie es mit einer maximalen Sequenzlänge von + 100. Verwenden Sie das, was für Ihre Anwendung am besten geeignet ist.
Nicht unbedingt. Der Grund, warum in Keras eine feste Länge verwendet wird, ist, dass dies die Leistung erheblich verbessert, indem Tensoren mit festen Formen erzeugt werden. Aber das ist nur für das Training. Nach dem Training haben Sie die richtigen Gewichte für Ihre Aufgabe gelernt.
Nehmen wir an, dass Sie nach stundenlangem Training feststellen, dass die maximale Länge Ihres Modells nicht groß / klein genug ist und Sie nun die Zeitschritte ändern müssen. Extrahieren Sie einfach die erlernten Gewichte aus dem alten Modell und erstellen Sie ein neues Modell mit den neuen Zeitschritten und spritze die erlernten Gewichte hinein.
Sie können dies wahrscheinlich mit etwas tun, wie:
new_model.set_weights(old_model.get_weights())
Ich habe es nicht selbst ausprobiert. Bitte probieren Sie es aus und veröffentlichen Sie Ihre Ergebnisse hier zum Vorteil aller. Hier sind einige Links: eins zwei
quelle
max length + 100
. Siehe meine Antwort zum Beispiel Code.Bidirectional(LSTM)()
undRepeatVector()
Ebenen erhöht , und die Vorhersagen sind absolut realisierbar.