2017-09-29 7 views
0

I lu LSTM-autoencoder dans ce tutoriel: https://blog.keras.io/building-autoencoders-in-keras.html, et coller la mise en oeuvre de keras correspondant ci-dessous:Comment appliquer LSTM-autoencoder à des données de séries temporelles de longueur variable?

from keras.layers import Input, LSTM, RepeatVector 
from keras.models import Model 

inputs = Input(shape=(timesteps, input_dim)) 
encoded = LSTM(latent_dim)(inputs) 

decoded = RepeatVector(timesteps)(encoded) 
decoded = LSTM(input_dim, return_sequences=True)(decoded) 

sequence_autoencoder = Model(inputs, decoded) 
encoder = Model(inputs, encoded) 

Dans cette mise en oeuvre, on fixe l'entrée à être de forme (pas de temps, input_dim), ce qui signifie que la longueur de les données de séries chronologiques sont fixées à timesteps. Si je me souviens bien RNN/LSTM peut gérer des données de séries temporelles de longueurs variables et je me demande s'il est possible de modifier le code ci-dessus pour accepter des données de n'importe quelle longueur?

Merci!

Répondre

2

Vous pouvez utiliser shape=(None, input_dim)

Mais le RepeatVector aurez besoin de prendre des dimensions hacking directement à partir du tenseur d'entrée. (Le code fonctionne avec tensorflow, pas sûr de theano)

import keras.backend as K 

def repeat(x): 

    stepMatrix = K.ones_like(x[0][:,:,:1]) #matrix with ones, shaped as (batch, steps, 1) 
    latentMatrix = K.expand_dims(x[1],axis=1) #latent vars, shaped as (batch, 1, latent_dim) 

    return K.batch_dot(stepMatrix,latentMatrix) 


decoded = Lambda(repeat)([inputs,encoded]) 
decoded = LSTM(input_dim, return_sequences=True)(decoded) 
+0

Merci! Avez-vous une idée de la manière de transmettre des données de longueur variable dans l'autoencodeur? J'ai essayé de convertir une liste de tableaux var-length en tableau mais j'ai échoué. J'ai essayé de lui transmettre directement une liste de tableaux var-length, mais j'ai reçu une erreur disant: Erreur lors de la vérification de l'entrée du modèle: la liste des tableaux Numpy que vous transmettez à votre modèle n'est pas la taille attendue. Prévu pour voir 1 tableaux mais à la place eu la liste suivante de 3773 tableaux: [array ([[0.300544, 0.251966], '. – username123

+0

https://stackoverflow.com/questions/46144191/keras-misinterprets-training-data-shape/ 46146146 # 46146146 –

+1

Il est également possible de remplir les tableaux avec des valeurs factices afin qu'ils obtiennent tous la même taille et utilisent le masquage. (Je ne l'ai jamais utilisé, mais vous pouvez utiliser google pour masquer sur keras) –