2017-09-01 4 views
2

Je me familiarise avec les LSTM et j'ai besoin de clarté sur quelque chose. Je modélise une série temporelle en utilisant t-300: t-1 pour prédire t: t + 60. Ma première approche a consisté à mettre en place un LSTM comme celui-ci:Pour Keras LSTM, quelle est la différence entre les caractéristiques de décalage et les caractéristiques temporelles?

# fake dataset to put words into code: 
X = [[1,2...299,300],[2,3,...300,301],...] 
y = [[301,302...359,360],[302,303...360,361],...] 

# LSTM requires (num_samples, timesteps, num_features) 
X = X.reshape(X.shape[0],1,X.shape[1]) 

model = Sequential() 
model.add(LSTM(n_neurons[0], batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True)) 
model.add(Dense(y.shape[1])) 
model.compile(loss='mse', optimizer='adam') 

model.fit(X, y, epochs=1, batch_size=1, verbose=1, shuffle=False) 

Avec mon jeu de données réelles, les résultats ont été suboptimale, et sur le processeur, il a été en mesure de former 1 époque d'environ 400 000 échantillons en 20 minutes. Le réseau convergeait rapidement après une seule époque, et pour n'importe quel ensemble de points je l'ai nourri, les mêmes résultats seraient sortis.

Mon dernier changement a été de remodeler X de la manière suivante:

X = X.reshape(X.shape[0],X.shape[1],1) 

La formation semble aller plus lent (je ne l'ai pas essayé sur l'ensemble des données), mais il est noticably plus lent. Il faut environ 5 minutes pour s'entraîner sur une seule période de 2 800 échantillons. J'ai joué avec un plus petit sous-ensemble de mes données réelles et un plus petit nombre d'époques et il semble être prometteur. Je ne reçois pas la même sortie pour différentes entrées. Est-ce que quelqu'un peut m'aider à comprendre ce qui se passe ici?

Répondre

1

Dans Keras, timesteps dans (num_samples, timesteps, num_features) détermine combien d'étapes BPTT va propager l'erreur en arrière.

Cela, à son tour, prend plus de temps à faire, d'où le ralentissement que vous observez.

X.reshape(X.shape[0], X.shape[1], 1) est la bonne chose à faire dans votre cas, car ce que vous avez est une seule fonction, avec 300 timesteps.