Exemples de LSTM un-à-plusieurs, plusieurs-à-un et plusieurs-à-plusieurs dans Keras
Cas d'utilisation de LSTM pour différentes tâches d'apprentissage profond.
Created on February 2|Last edited on February 2
Comment
Dans ce rapport, j'explique les mémoires à long court terme (LSTM) et comment les construire avec Keras. Il existe principalement quatre modes pour faire fonctionner un réseau de neurones récurrent (RNN).

Voyons comment se présente un extrait de code minimaliste pour chacun d'entre eux dans Keras.
Les LSTM peuvent être utilisés pour une multitude de tâches d'apprentissage profond en utilisant différents modes. Nous allons passer en revue chacun de ces modes avec son cas d'utilisation et un extrait de code dans Keras.
One-to-Many
Les problèmes de séquence One-to-Many sont des problèmes de séquence où les données d'entrée ont un pas de temps, et la sortie contient un vecteur de valeurs multiples ou des pas de temps multiples. Ainsi, nous avons une seule entrée et une séquence de sorties. Un exemple typique est le sous-titrage d'images, où la description d'une image est générée. Pour en savoir plus, consultez l'étonnant rapport "Generate Meaningful Captions for Images with Attention Models" de Rajesh Shreedhar Bhat et Souradip Chakraborty.
Voyons cela à l'aide d'un exemple
Nous avons créé un jeu de données jouet présenté dans l'image ci-dessous. Les données d'entrée sont une séquence de chiffres, tandis que les données de sortie sont la séquence des deux chiffres suivants le chiffre d'entrée.

Entraînons-le avec un LSTM vanille. Vous pouvez voir la métrique de perte pour les données de formation et de validation, comme indiqué dans les graphiques.
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()])
Lorsqu'on le prédit avec des données de test, où l'entrée est 10, on s'attend à ce que le modèle génère une séquence [11, 12]. Le modèle a prédit la séquence [[11.00657 12.138181]], qui est proche des valeurs attendues.
Many-to-One
Dans les problèmes de Many-to-One, nous avons une séquence de données en entrée, et nous devons prédire une sortie unique. L'analyse des sentiments ou la classification de textes est un tel cas d'utilisation.
Voyons cela à l'aide d'un exemple
Nous avons créé un jeu de données jouet, comme le montre l'image. L'entrée comporte 15 échantillons avec trois pas de temps, et la sortie est la somme des valeurs de chaque pas.

Entraînons-le avec un LSTM vanille. Vous pouvez voir la métrique de perte pour les données de formation et de validation, comme indiqué dans les graphiques.
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()])
Lorsqu'on le prédit avec des données de test, l'entrée est une séquence de trois pas de temps : [50,51,52]. La sortie attendue doit être la somme des valeurs, soit 153. Le modèle a prédit la valeur : [[152.9253]], qui est incroyablement proche de la valeur attendue.
Many-to-Many
L'apprentissage de séquences Many-to-Many peut être utilisé pour la traduction automatique, où la séquence d'entrée est dans une certaine langue et la séquence de sortie est dans une autre langue. Il peut également être utilisé pour la classification vidéo, où la séquence d'entrée est la représentation des caractéristiques de chaque image de la vidéo à différents moments.
Le réseau encodeur-décodeur est couramment utilisé pour les tâches de séquences multiples. L'encodeur-décodeur n'est qu'un nom fantaisiste pour une architecture neuronale comportant deux couches LSTM.
Voyons cela à l'aide d'un exemple
Dans cette expérience, nous avons créé un jeu de données présenté dans l'image ci-dessous. L'entrée comporte 20 échantillons avec trois pas de temps chacun, tandis que la sortie comporte les trois multiples consécutifs suivants de 5.

Entraînons-le avec une architecture Encodeur-Decodeur classique. Vous pouvez voir la métrique de perte pour les données de formation et de validation, comme indiqué dans les graphiques.
model = Sequential()# encoder layermodel.add(LSTM(100, activation='relu', input_shape=(3, 1)))# repeat vectormodel.add(RepeatVector(3))# decoder layermodel.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()])
Pour le prédire avec des données de test, l'entrée est une séquence de trois pas de temps : [300, 305, 310]. La sortie attendue devrait être une séquence des trois prochains multiples consécutifs de cinq, [315, 320, 325]. Le modèle a prédit la valeur : [[[315.29865], [321.0397 ], [327.0003 ]]] qui est proche de la valeur attendue.
Autres lectures
Voici quelques-unes des ressources que j'ai trouvées pertinentes pour ma propre compréhension de ces concepts.
(L'article du blog d'Usman Malik intitulé "Solving Sequence Problems with LSTM in Keras" a été utilisé pour créer des extraits de code).
Add a comment
Iterate on AI agents and models faster. Try Weights & Biases today.