2

Je suis en train de créer simplement RNN dans keras qui apprendra sur cet ensemble de données:Pourquoi la couche LAS de keras nécessite une forme d'entrée?

X = np.array([[1, 1, 1, 1, 1, 1], [1, 1, 1], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2]]) 
y = np.array([[1], [1], [0], [1], [0]]) 

où les tableaux de 1s est 1 et 2 s tableaux est 0

voici mon code:

from keras.models import Sequential 
from keras.layers import Dense, Activation 
from keras.layers import LSTM 
from keras.optimizers import RMSprop 
import numpy as np 

X = np.array([[1, 1, 1, 1, 1, 1], [1, 1, 1], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2]]) 
y = np.array([[1], [1], [0], [1], [0]]) 

print('Build model...') 
model = Sequential() 
model.add(LSTM(128)) 
model.add(Dense(1)) 
model.add(Activation('softmax')) 

optimizer = RMSprop(lr=0.01) 
model.compile(loss='categorical_crossentropy', optimizer=optimizer) 

mais j'obtiens l'erreur:

ValueError: The first layer in a Sequential model must get an input_shape or batch_input_shape argument.

pourquoi la couche LSTM doit avoir une forme d'entrée? comme je sais, en théorie, il peut y avoir différentes formes d'entrée, parce que c'est un réseau neuronal récurrent.

comment faire fonctionner mon code?

+0

Pourriez-vous imprimer 'X.shape'? –

+0

@ MarcinMożejko (5,) –

+0

Pourriez-vous l'imprimer? (Je veux dire 'X') –

Répondre

2

Donc, votre erreur vient du fait que vous devez spécifier la forme d'entrée de votre modèle. Dans Sequential cas, vous le faites généralement en définissant input_shape dans une première couche.

Maintenant, le problème est dans votre saisie. Avec

X = [[1, 1, 1, 1, 1, 1], [1, 1, 1], [2, 2, 2, 2, 2], [1, 1, 1, 1, 1, 1, 1, 1], [2, 2, 2]] 
Y = [[1], [1], [0], [1], [0]] 

Vous aurez des problèmes car chaque séquence doit avoir la même longueur. Ce que je vous conseille de le faire est d'utiliser pad_sequences

from keras.preprocessing.sequence import pad_sequences 

X = pad_sequences(X) 
Y = numpy.array(Y) 

maintenant - comme vous l'avez mentionné - votre tâche est une tâche MLP donc il est bon d'utiliser une couche Embedding:

from keras.layers import Embedding 

vocabulary_size = 2 + 1 # Maximal word index + 1 
sequence_length = 8 # Maximal length of a sequence 
embedding_dimension = 20 # You could choose a different one 

model = Sequential() 
model.add(Embedding(vocabulary_size, embedding_dimension, input_length=sequence_length) 
model.add(LSTM(128)) 
model.add(Dense(1)) 
model.add(Activation('sigmoid')) 

optimizer = RMSprop(lr=0.01) 
model.compile(loss='binary_crossentropy', optimizer=optimizer) 

J'ai changé le activation à un 'sigmoid' beacuse 'softmax' ne fonctionnerait pas avec la sortie 1-d. En conséquence j'ai changé la perte à 'binary_crossentropy'.

+0

merci. Ça marche. comment puis-je utiliser la méthode prédire? quand j'écris model.predict (X [0]), j'obtiens: ValueError: Erreur lors de la vérification: embedding_input_1 attendu pour avoir la forme (None, 8) mais got array with shape (8, 1) –

+0

Essayez 'model.predict (X [: 1]) '. N'oubliez pas que vous devez fournir une matrice de forme complète à votre modèle pendant la prédiction. –

+0

Pourquoi ne pas utiliser le masquage? :) ça fonctionne bien avec les plongements et LSTM utilisés les uns après les autres. –