Sam B.
Sam B.

Reputation: 3043

Keras model input shape wrong

I've got a keras model with the layout below

def keras_model(x_train, y_train, x_test, y_test):
    model = Sequential()
    model.add(Dense(128, input_dim=x_train.shape[1], activation='relu'))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(512,activation='relu'))
    model.add(Dense(256,activation='relu'))
    model.add(Dense(128,activation='relu'))
    #model.add(Dense(10,activation='relu'))
    model.add(Dense(y_train.shape[1], activation='softmax'))
    model.compile(loss='categorical_crossentropy', optimizer='adam')
    monitor = EarlyStopping(monitor='val_loss', min_delta=1e-3, patience=5, verbose=1, mode='auto')
    checkpointer = ModelCheckpoint(filepath="best_weights.hdf5", verbose=0, save_best_only=True) # save best model

    model.fit(x_train ,y_train, validation_data=(x_test, y_test),callbacks=[monitor,checkpointer], verbose=2,epochs=1000)
    model.load_weights('best_weights.hdf5') # load weights from best model

    return model

Trained on data from open-ai gym cartpole game and the model saved. The next step is to use the trained model to make predictions

from keras.models import load_model
model = load_model('data/model-v0.h5')
action = random.randrange(0,2)

import gym
env = gym.make("CartPole-v0")
env.reset()
>>> array([ 0.02429215, -0.00674185, -0.03713565, -0.0046836 ])

import random
action = random.randrange(0,2)
observation, reward, done, info = env.step(action)
observation.shape
>>> (4,)

new_observation, reward, done, info = env.step(action)
prev_obs = new_observation
prev_obs
>>> array([-0.00229585,  0.15330146,  0.02160273, -0.30723955])

prev_obs.shape
>>> (4,)

model.predict(prev_obs)
>>>
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-25-943f2f44ed64> in <module>()
----> 1 model.predict(prev_obs)

c:\users\samuel\appdata\local\programs\python\python35\lib\site-packages\keras\engine\training.py in predict(self, x, batch_size, verbose, steps)
   1145                              'argument.')
   1146         # Validate user data.
-> 1147         x, _, _ = self._standardize_user_data(x)
   1148         if self.stateful:
   1149             if x[0].shape[0] > batch_size and x[0].shape[0] % batch_size != 0:

c:\users\samuel\appdata\local\programs\python\python35\lib\site-packages\keras\engine\training.py in _standardize_user_data(self, x, y, sample_weight, class_weight, check_array_lengths, batch_size)
    747             feed_input_shapes,
    748             check_batch_axis=False,  # Don't enforce the batch size.
--> 749             exception_prefix='input')
    750 
    751         if y is not None:

c:\users\samuel\appdata\local\programs\python\python35\lib\site-packages\keras\engine\training_utils.py in standardize_input_data(data, names, shapes, check_batch_axis, exception_prefix)
    135                             ': expected ' + names[i] + ' to have shape ' +
    136                             str(shape) + ' but got array with shape ' +
--> 137                             str(data_shape))
    138     return data
    139 

ValueError: Error when checking input: expected dense_1_input to have shape (4,) but got array with shape (1,)

The shape of the observation is similar that of the training data used, the issue is even as you can see as the observation and the prev_observation has a shape of (4,) but when fed into the model to predict throws an error and claims the input has a shape of (1,).

I have tried even reshaping it with

prev_obs.shape = (4,)
prev_obs.reshape((4,))

but it still throws the same error.

Upvotes: 2

Views: 4987

Answers (1)

zimmerrol
zimmerrol

Reputation: 4951

The API of keras always assumes that you supply the data in batches or in an array from which it can extract batches. Therefore, eventhough the first layer of your model requires an input shape of (4,), you have to reshape the data to have the shape (1,4).

model.predict(prev_obs.reshape((1, -1)

This tells the model to make a prediction on 1 data sample, which consists out of a 4-dimensional vector (the observation).

Upvotes: 7

Related Questions