2016-10-17 4 views
4

Je veux utiliser un réseau neuronal LSTM avec keras pour prévoir des groupes de séries temporelles et j'ai des difficultés à faire correspondre le modèle à ce que je veux. Les dimensions de mes données sont:Dimensions ne correspondant pas dans keras Modèle LSTM

tenseur d'entrée: (data length, number of series to train, time steps to look back)

tenseur de sortie: (data length, number of series to forecast, time steps to look ahead)

Note: Je veux garder les dimensions exactement comme ça, pas de transposition .

Un code de données factice qui reproduit le problème est:

import numpy as np 
from keras.models import Sequential 
from keras.layers import Dense, TimeDistributed, LSTM 

epoch_number = 100 
batch_size = 20 
input_dim = 4 
output_dim = 3 
look_back = 24 
look_ahead = 24 
n = 100 

trainX = np.random.rand(n, input_dim, look_back) 
trainY = np.random.rand(n, output_dim, look_ahead) 
print('test X:', trainX.shape) 
print('test Y:', trainY.shape) 

model = Sequential() 

# Add the first LSTM layer (The intermediate layers need to pass the sequences to the next layer) 
model.add(LSTM(10, batch_input_shape=(None, input_dim, look_back), return_sequences=True)) 

# add the first LSTM layer (the dimensions are only needed in the first layer) 
model.add(LSTM(10, return_sequences=True)) 

# the TimeDistributed object allows a 3D output 
model.add(TimeDistributed(Dense(look_ahead))) 

model.compile(loss='mean_squared_error', optimizer='adam', metrics=['accuracy']) 
model.fit(trainX, trainY, nb_epoch=epoch_number, batch_size=batch_size, verbose=1) 

Ce trows:

Exception: Erreur lorsque la cible du modèle de vérification: prévu timedistributed_1 avoir la forme (Aucun, 4 , 24) mais le tableau a la forme (100, 3, 24)

Le problème semble être lors de la définition de la couche TimeDistributed. Comment définir le calque TimeDistributed pour qu'il compile et s'entraîne?

Répondre

0

Le message d'erreur est un peu trompeur dans votre cas. Votre noeud de sortie du réseau s'appelle timedistributed_1 parce que c'est le dernier noeud de votre modèle séquentiel. Ce que le message d'erreur essaie de vous dire, c'est que la sortie de ce nœud ne correspond pas à la cible que votre modèle est en train de correspondre à, c'est-à-dire vos étiquettes trainY.

Votre trainY a une forme de (n, output_dim, look_ahead), de sorte (100, 3, 24) mais le réseau est la production une forme de sortie de (batch_size, input_dim, look_ahead). Le problème dans ce cas est que output_dim! = input_dim. Si votre dimension de temps change, vous aurez peut-être besoin d'un remplissage ou d'un noeud de réseau qui supprime ce temps.

0

Je pense que le problème est que vous attendez output_dim (! = input_dim) à la sortie de TimeDistributed, alors que ce n'est pas possible. Cette dimension est ce qu'elle considère comme la dimension time: elle est conservée.

L'entrée doit être au moins 3D, et la dimension de l'indice un sera être considéré comme la dimension temporelle.

Le but de TimeDistributed est d'appliquer le même couche à chaque pas de temps. Vous ne pouvez vous retrouver qu'avec le même nombre de pas de temps que vous avez commencé.

Si vous avez vraiment besoin de réduire cette dimension de 4 à 3, je pense que vous devrez soit ajouter une autre couche à la fin, ou utiliser quelque chose de différent de TimeDistributed.PS: un indice pour trouver ce problème était que output_dim n'est jamais utilisé lors de la création du modèle, il n'apparaît que dans les données de validation. Bien que ce ne soit qu'une odeur de code (il n'y a peut-être rien de mal à cette observation), c'est quelque chose qui mérite d'être vérifié.

+0

Je fais la transposition car pour une même série temporelle, cette transposition rend la prévision beaucoup plus précise. J'ai eu l'idée de suivre ce tutoriel: http://machinelearningmastery.com/time-series-prediction-lstm-recurrent-neural-networks-python-keras/ Mais je suppose qu'il y a encore du travail à faire pour beaucoup-à- beaucoup de relations –