Skip to main content

One-to-Many, Many-to-One und Many-to-Many LSTM Beispiele in Keras

Anwendungsfälle von LSTM für verschiedene Deep Learning-Aufgaben
Created on February 2|Last edited on February 2
Dieser Artikel wurde aus dem Englischen übersetzt. Hier ist das Original.
In diesem Bericht erkläre ich das Langzeitgedächtnis (LSTM) und wie man es mit Keras aufbaut. Es gibt prinzipiell vier Modi, um ein rekurrentes neuronales Netzwerk (RNN) zu betreiben.



Sehen wir uns an, wie ein minimalistischer Codeschnipsel für jede dieser Möglichkeiten in Keras aussieht

LSTMs können für eine Vielzahl von Deep-Learning-Aufgaben mit verschiedenen Modi verwendet werden. Wir werden jeden dieser Modi zusammen mit seinem Anwendungsfall und einem Codeschnipsel in Keras durchgehen.

One-to-Many

One-to-many-Sequenzprobleme sind Sequenzprobleme, bei denen die Eingabedaten einen Zeitschritt haben und die Ausgabe einen Vektor mit mehreren Werten oder mehreren Zeitschritten enthält. Wir haben also eine einzige Eingabe und eine Sequenz von Ausgaben. Ein typisches Beispiel ist die Beschriftung von Bildern, bei der die Beschreibung eines Bildes generiert wird. Lesen Sie diesen erstaunlichen Bericht »Generate Meaningful Captions for Images with Attention Models« von Rajesh Shreedhar Bhat und Souradip Chakraborty, um mehr zu erfahren.

Dies soll anhand eines Beispiels verdeutlicht werden

Wir haben einen Spieldatensatz erstellt, der in der folgenden Abbildung dargestellt ist. Die Eingabedaten sind eine Folge von Zahlen, während die Ausgabedaten die Folge der nächsten beiden Zahlen nach der Eingabezahl sind.



Wir trainieren es mit einem Vanilla LSTM. Sie können die Verlustmetrik für die Trainings- und Validierungsdaten sehen, wie in den Diagrammen dargestellt.
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(1, 1)))
model.add(Dense(2))

model.compile(optimizer='adam', loss='mse')

wandb.init(entity='ayush-thakur', project='dl-question-bank')

model.fit(X, Y, epochs=1000, validation_split=0.2, batch_size=3, callbacks=[WandbCallback()])
Bei der Vorhersage mit Testdaten, bei denen die Eingabe 10 ist, erwarten wir, dass das Modell eine Sequenz [11, 12] erzeugt. Das Modell hat die Sequenz [[11.00657 12.138181]] vorhergesagt, was nahe an den erwarteten Werten liegt.




Many-to-One

Bei Many-to-One-Sequenz-Problemen haben wir eine Sequenz von Daten als Eingabe, und wir müssen eine einzelne Ausgabe vorhersagen. Die Analyse von Gefühlen oder die Klassifizierung von Texten ist ein solcher Anwendungsfall.

Dies soll anhand eines Beispiels verdeutlicht werden

Wir haben einen Spieldatensatz erstellt, wie auf dem Bild zu sehen ist. Die Eingabe besteht aus 15 Stichproben mit drei Zeitschritten, und die Ausgabe ist die Summe der Werte in jedem Schritt.

Wir trainieren es mit einem Vanilla LSTM. Sie können die Verlustmetrik für die Trainings- und Validierungsdaten sehen, wie in den Diagrammen dargestellt.
tf.keras.backend.clear_session()
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(3, 1)))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mse')

wandb.init(entity='ayush-thakur', project='dl-question-bank')

history = model.fit(X, Y, epochs=1000, validation_split=0.2, verbose=1, callbacks=[WandbCallback()])
Bei der Vorhersage mit Testdaten ist die Eingabe eine Folge von drei Zeitschritten: [50,51,52]. Die erwartete Ausgabe sollte die Summe der Werte sein, d. h. 153. Das Modell hat den Wert vorhergesagt: [[152.9253]], was wahnsinnig nahe am erwarteten Wert liegt.




Many-to-Many

Many-to-Many-Sequenzlernen kann für die maschinelle Übersetzung verwendet werden, bei der die Eingabesequenz in einer Sprache und die Ausgabesequenz in einer anderen Sprache vorliegt. Es kann auch für die Videoklassifizierung verwendet werden, wobei die Eingabesequenz die Merkmalsdarstellung jedes Einzelbildes des Videos in verschiedenen Zeitschritten ist.
Ein Encoder-Decoder-Netzwerk wird üblicherweise für Many-to-Many-Sequenzen verwendet. Hier ist Encoder-Decoder nur ein schicker Name für eine neuronale Architektur mit zwei LSTM-Schichten.

Dies soll anhand eines Beispiels verdeutlicht werden

In diesem Spielexperiment haben wir einen Datensatz erstellt, der in der folgenden Abbildung dargestellt ist. Die Eingabe besteht aus 20 Stichproben mit jeweils drei Zeitschritten, während die Ausgabe die nächsten drei aufeinanderfolgenden Vielfachen von 5 enthält.


Lassen Sie es uns mit einer einfachen Encoder-Decoder-Architektur trainieren. Sie können die Verlustmetrik für die Trainings- und Validierungsdaten sehen, wie in den Diagrammen dargestellt.
model = Sequential()

# encoder layer
model.add(LSTM(100, activation='relu', input_shape=(3, 1)))

# repeat vector
model.add(RepeatVector(3))

# decoder layer
model.add(LSTM(100, activation='relu', return_sequences=True))

model.add(TimeDistributed(Dense(1)))
model.compile(optimizer='adam', loss='mse')

print(model.summary())

wandb.init(entity='ayush-thakur', project='dl-question-bank')

history = model.fit(X, Y, epochs=1000, validation_split=0.2, verbose=1, batch_size=3, callbacks=[WandbCallback()])
Bei der Vorhersage mit Testdaten ist die Eingabe eine Folge von drei Zeitschritten: [300, 305, 310]. Die erwartete Ausgabe sollte eine Folge der nächsten drei aufeinanderfolgenden Vielfachen von fünf sein: [315, 320, 325]. Das Modell hat den Wert vorhergesagt: [[[315.29865], [321.0397 ], [327.0003 ]]], was nahe am erwarteten Wert liegt.



Weitere Lektüre

Dies sind einige der Ressourcen, die ich für mein eigenes Verständnis dieser Konzepte für wichtig hielt.
(Der Blog-Beitrag Solving Sequence Problems with LSTM in Keras von Usman Malik wurde für die Erstellung der Code-Schnipsel verwendet).
Iterate on AI agents and models faster. Try Weights & Biases today.