2017-02-14 4 views
1

J'essaye de faire un exemple de base MLP dans keras. Mes données d'entrée ont la forme train_data.shape = (2000,75,75) et mes données de test ont la forme test_data.shape = (500,75,75). 2000 et 500 sont les nombres d'échantillons de données d'apprentissage et de formation (en d'autres termes, la forme des données est (75,75), mais il y a 2000 et 500 données de formation et d'essai). La sortie devrait avoir deux classes.Keras correcte forme d'entrée pour perceptron multicouche

Je ne suis pas sûr quelle valeur utiliser pour le paramètre input_shape sur la première couche du réseau. En utilisant le code de l'exemple mnist dans le référentiel keras, j'ai (mis à jour):

from six.moves import cPickle 
from keras.models import Sequential 
from keras.layers import Dense, Dropout, Activation 
from keras.utils import np_utils 
from keras.optimizers import RMSprop 

# Globals 
NUM_CLASSES = 2 
NUM_EPOCHS = 10 
BATCH_SIZE = 250 

def loadData(): 
    fData = open('data.pkl','rb') 
    fLabels = open('labels.pkl','rb') 
    data = cPickle.load(fData) 
    labels = cPickle.load(fLabels) 

    train_data = data[0:2000] 
    train_labels = labels[0:2000] 
    test_data = data[2000:] 
    test_labels = labels[2000:] 
    return (train_data, train_labels, test_data, test_labels) 

# Load data and corresponding labels for model 
train_data, train_labels, test_data, test_labels = loadData() 

train_labels = np_utils.to_categorical(train_labels, NUM_CLASSES) 
test_labels = np_utils.to_categorical(test_labels, NUM_CLASSES) 

print(train_data.shape) 
print(test_data.shape) 

model = Sequential() 
model.add(Dense(512, input_shape=(5625,))) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 
model.add(Dense(512)) 
model.add(Activation('relu')) 
model.add(Dropout(0.2)) 
model.add(Dense(2)) 
model.add(Activation('softmax')) 

model.summary() 

model.compile(loss='categorical_crossentropy', 
       optimizer=RMSprop(), 
       metrics=['accuracy']) 

history = model.fit(train_data, train_labels, validation_data=(test_data, test_labels), 
        batch_size=BATCH_SIZE, nb_epoch=NUM_EPOCHS, 
        verbose=1) 
score = model.evaluate(test_data, test_labels, verbose=0) 
print('Test score:', score[0]) 
print('Test accuracy:', score[1]) 

5625 est 75 * 75 (émulant l'exemple MNIST). L'erreur que j'obtiens est:

Error when checking model input: expected dense_input_1 to have 2 dimensions, but got array with shape (2000, 75, 75) 

Des idées?

+0

Pouvez-vous montrer plus de votre code? Incluant spécifiquement cette ligne qui vous donne cette erreur? Vous mentionnez deux variables 'train_data' et' test_data', mais je ne les vois pas utilisées dans le code, donc je ne suis pas sûr de savoir comment elles contribueraient à la situation dans laquelle vous vous trouvez. Existe-t-il un exemple de code complet, minimal? qui génère cette erreur? – onlynone

+0

vous pourriez avoir juste besoin de remodeler 'test_data' et' train_data' pour correspondre à '5625', avec 'X.reshape (-1,75 * 75)' – toine

Répondre

0

Dans l'exemple keras MLP, https://github.com/fchollet/keras/blob/master/examples/mnist_mlp.py

# the data, shuffled and split between train and test sets 
(X_train, y_train), (X_test, y_test) = mnist.load_data() 

X_train = X_train.reshape(60000, 784) 
X_test = X_test.reshape(10000, 784) 

Et l'entrée modèle

model = Sequential() 
model.add(Dense(512, input_shape=(784,))) 

Vous devez remodeler votre train et test (2000,75 * 75) et (500,75 * 75) avec

train_data = train_data.reshape(2000, 75*75) 
test_data = test_data.reshape(500, 75*75) 

puis définissez la forme d'entrée du modèle que vous avez fait

model.add(Dense(512, input_shape=(75*75,))) 
+0

Cela a fonctionné pour moi. Merci! – 20XX