2017-02-20 1 views
1

J'utilise Keras avec tensorflow comme backends et obtenir des erreurs incompatibles:Keras: ValueError: entrée 0 est émet couche incompatible

model = Sequential() 
model.add(LSTM(64, input_dim = 1)) 
model.add(Dropout(0.2)) 
model.add(LSTM(16)) 

L'erreur suivante indique:

Traceback (most recent call last): 
    File "train_lstm_model.py", line 36, in <module> 
    model.add(LSTM(16)) 
    File "/home/***/anaconda2/lib/python2.7/site-packages/keras/models.py", line 332, in add 
    output_tensor = layer(self.outputs[0]) 
    File "/home/***/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 529, in __call__ 
    self.assert_input_compatibility(x) 
    File "/home/***/anaconda2/lib/python2.7/site-packages/keras/engine/topology.py", line 469, in assert_input_compatibility 
    str(K.ndim(x))) 
ValueError: Input 0 is incompatible with layer lstm_2: expected ndim=3, found ndim=2 

Comment puis-je résoudre ce problème problème?

Version Keras: 1.2.2 Version tensorflow: 0,12

Répondre

1

La couche LSTM est accepter une entrée en forme de (len_of_sequences, nb_of_features). La forme d'entrée que vous avez fournie est seulement 1-dim donc c'est d'où vient l'erreur. La forme exacte du message d'erreur provient du fait que la forme réelle des données inclut le batch_size. Ainsi, la forme réelle des données introduites dans la couche est (batch_size, len_of_sequences, nb_of_features). Votre forme est (batch_size, 1) et c'est la raison derrière 3d vs 2d entrées.

De plus - vous pourriez avoir un problème similaire avec une deuxième couche. Afin de rendre votre couche LSTM pour retourner une séquence que vous devez changer sa définition:

model.add(LSTM(64, input_shape = (len_of_seq, nb_of_features), return_sequences=True) 

ou:

model.add(LSTM(64, input_dim = nb_of_features, input_len = len_of_sequence, return_sequences=True) 
+0

J'ai vérifié que cela fonctionne en réglant uniquement le 'input_dim' seul, le conditionnement qui la définition de 'return_sequences' à True. Pourriez-vous me dire pourquoi je dois définir 'return_sequences'? –

+0

Vous devez définir la valeur true à chaque fois que votre sortie est envoyée à un réseau récurrent. Cela permet à votre couche de sortir toute la séquence des calculs. Si elle est définie sur false, un vecteur unidimensionnel est renvoyé (par défaut, il est défini sur la dernière sortie d'une séquence). –

+0

Ma réponse est-elle correcte ou incorrecte? –