136 votes

Plusieurs à un et plusieurs à plusieurs exemples de LSTM à Keras

J'essaie de comprendre LSTMs et comment les construire avec Keras. J'ai découvert, qu'il y a principalement 4 modes d'exécuter un RNN (les 4 de droite dans l'image)

enter image description here Source de l'Image: Andrej Karpathy

Maintenant, je me demande comment un minimaliste extrait de code pour chacun d'entre eux pourrait ressembler dans Keras. Donc, quelque chose comme

model = Sequential()
model.add(LSTM(128, input_shape=(timesteps, data_dim)))
model.add(Dense(1))

pour chacun des 4 tâches, peut-être avec un peu d'explication.

150voto

Marcin Możejko Points 19602

Donc:

  1. Un-à-un: vous pouvez utiliser un Dense de la couche que vous n'êtes pas de traitement de séquences:
    model.add(Dense(output_size, input_shape=input_shape))

2. Un-à-plusieurs: cette option n'est pas pris en charge ainsi que le chaînage de modèles n'est pas très facile en Keras, de sorte que la version suivante est la plus simple:

    model.add(RepeatVector(number_of_times, input_shape=input_shape))
    model.add(LSTM(output_size, return_sequences=True))
  1. Plusieurs-à-un: en fait, votre extrait de code est (presque) un exemple de cette approche:
    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim)))
  1. Plusieurs-à-plusieurs: C'est la méthode la plus simple extrait de quand la longueur de l'entrée et de sortie correspond au nombre de récurrent suit:
    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
  1. Plusieurs-à-plusieurs, quand le nombre de mesures diffèrent d'entrée/de sortie longueur: c'est bizarre, dur dans Keras. Il n'y a pas des extraits de code pour code.

EDIT: Ad 5

Dans une de mes applications récentes, nous avons mis en place quelque chose qui pourrait être similaire à plusieurs à plusieurs à partir de la 4ème image. Dans le cas où vous voulez avoir un réseau avec l'architecture suivante (quand une entrée est plus longue que la sortie):

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | | | | 
                                  O O O O O O

Vous pourriez obtenir de la manière suivante:

    model = Sequential()
    model.add(LSTM(1, input_shape=(timesteps, data_dim), return_sequences=True))
    model.add(Lambda(lambda x: x[:, -N:, :]

N est le nombre de mesures que vous souhaitez couvrir (sur l'image N = 3).

À partir de ce point d'arriver à:

                                        O O O
                                        | | |
                                  O O O O O O
                                  | | | 
                                  O O O 

est aussi simple que artificielle rembourrage séquence de longueur N en utilisant par exemple avec 0 vecteurs, afin de l'adapter à une taille appropriée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X