web-dev-qa-db-fra.com

Comment connecter des couches LSTM dans Keras, RepeatVector ou return_sequence = True?

J'essaie de développer un modèle d'encodeur en kéros pour les séries temporelles. La forme des données est (5039, 28, 1), ce qui signifie que mon seq_len est 28 et j'ai une fonctionnalité. Pour la première couche de l'encodeur, j'utilise 112 hunits, la deuxième couche en aura 56 et pour pouvoir revenir à la forme d'entrée du décodeur, j'ai dû ajouter une 3ème couche avec 28 hunits (cet autoencodeur est censé reconstruire son entrée). Mais je ne sais pas quelle est la bonne approche pour connecter les couches LSTM entre elles. AFAIK, je peux ajouter RepeatVector ou return_seq=True. Vous pouvez voir mes deux modèles dans le code suivant. Je me demande quelle sera la différence et quelle approche est la bonne?

Premier modèle utilisant return_sequence=True:

inputEncoder = Input(shape=(28, 1))
firstEncLayer = LSTM(112, return_sequences=True)(inputEncoder)
snd = LSTM(56, return_sequences=True)(firstEncLayer)
outEncoder = LSTM(28)(snd)

context = RepeatVector(1)(outEncoder)
context_reshaped = Reshape((28,1))(context)

encoder_model = Model(inputEncoder, outEncoder)
firstDecoder = LSTM(112, return_sequences=True)(context_reshaped)
outDecoder = LSTM(1, return_sequences=True)(firstDecoder)

autoencoder = Model(inputEncoder, outDecoder)

Deuxième modèle avec RepeatVector:

inputEncoder = Input(shape=(28, 1))
firstEncLayer = LSTM(112)(inputEncoder)
firstEncLayer = RepeatVector(1)(firstEncLayer)
snd = LSTM(56)(firstEncLayer)
snd = RepeatVector(1)(snd)
outEncoder = LSTM(28)(snd)
encoder_model = Model(inputEncoder, outEncoder)

context = RepeatVector(1)(outEncoder)
context_reshaped = Reshape((28, 1))(context)

firstDecoder = LSTM(112)(context_reshaped)
firstDecoder = RepeatVector(1)(firstDecoder)
sndDecoder = LSTM(28)(firstDecoder)

outDecoder = RepeatVector(1)(sndDecoder)
outDecoder = Reshape((28, 1))(outDecoder)

autoencoder = Model(inputEncoder, outDecoder)
7
Birish

Vous devrez probablement voir par vous-même laquelle est la meilleure, car cela dépend du problème que vous résolvez. Cependant, je vous donne la différence entre les deux approches.

Difference <code>return_sequences=True</code> and RepeatVector Essentiellement, return_sequences=True renvoie toutes les sorties que l'encodeur a observées dans le passé, tandis que RepeatVector répète la toute dernière sortie de l'encodeur.

32
thushv89