Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Keras correct input shape for multilayer perceptron

I'm trying to make a basic MLP example in keras. My input data has the shape train_data.shape = (2000,75,75) and my testing data has the shape test_data.shape = (500,75,75). 2000 and 500 are the numbers of samples of training and test data (in other words, the shape of the data is (75,75), but there are 2000 and 500 pieces of training and testing data). The output should have two classes.

I'm unsure what value to use for the input_shape parameter on the first layer of the network. Using the code from the mnist example in the keras repository, I have (updated):

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])

where 5625 is 75 * 75 (emulating the MNIST example). The error I get is:

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

Any ideas?

like image 941
20XX Avatar asked Feb 14 '17 19:02

20XX


People also ask

What is the input shape in Keras?

In a Keras layer, the input shape is generally the shape of the input data provided to the Keras model while training. The model cannot know the shape of the training data. The shape of other tensors(layers) is computed automatically.

What is the input of MLP?

'dense_input' is the input layer . 'dense' , 'dense_1' are the hidden layers — with 5 and 4 neurons respectively. dense_2 is the output layer (softmax layer)with 3 units, as we are solving multi class classification problem (3-classes).

What is the syntax for specifying the input dimension in a neural network?

If the data is multi-dimensional, like image data, then the input data must be given as (m, n) where m is the height-dimension and n is the width-dimension. Since 32 is the feature size, it is the column dimension of the input matrix. This means that the row dimension of the hidden layer is also 32.


1 Answers

From keras MLP example, 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)

And the model input

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

So you should reshape your train and test to (2000,75*75) and (500,75*75) with

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

and then set the model input shape as you did

model.add(Dense(512, input_shape=(75*75,)))
like image 197
maz Avatar answered Sep 18 '22 15:09

maz