Keras ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=5
Asked Answered
A

6

65

I have checked all the solutions, but still, I am facing the same error. My training images shape is (26721, 32, 32, 1), which I believe it is 4 dimension, but I don't know why error shows it is 5 dimension.

 model = Sequential()

 model.add(Convolution2D(16, 5, 5, border_mode='same', input_shape= input_shape ))

So this is how I am defining model.fit_generator

model.fit_generator(train_dataset, train_labels, nb_epoch=epochs, verbose=1,validation_data=(valid_dataset, valid_labels), nb_val_samples=valid_dataset.shape[0],callbacks=model_callbacks)
Art answered 6/12, 2017 at 1:28 Comment(0)
S
71

The problem is input_shape.

It should actually contain 3 dimensions only. And internally keras will add the batch dimension making it 4.

Since you probably used input_shape with 4 dimensions (batch included), keras is adding the 5th.

You should use input_shape=(32,32,1).

Silky answered 6/12, 2017 at 2:5 Comment(6)
No, that number is free. Keras will show that dimension as None in the model.summry(), for instance.Keown
My dimension for training data is array: (26721, 32, 32) and for valid. dimension is (6680,32,32). Now I explicitly define image size (32,32,1) , then it gives me error ValueError: Error when checking input: expected conv2d_9_input to have 4 dimensions, but got array with shape (6680, 32, 32) . I have also edit model_fit.generator in post, could you please check there?Art
Now the problem is in your data. Your data lacks the channel dimension: x_validation = x_validation.reshape(6680,32,32,1)Keown
Thanks very much for your helpArt
Can you help us here @DanielMöller. #64612584Cleodal
@DanielMöller I need an input shape of ndim=5, But my input shape= (18, 64, 1688), so I reshaped it as: data=data.reshape(18, 64, 1688, 1, 1). And pass this to my model that contains conv2D and convLSTM2D layers. But it gives me an error: Input 0 of layer conv_lst_m2d_88 is incompatible with the layer: expected ndim=5, found ndim=6. Full shape received: (None, None, 64, 211, 1, 128). How do I resolve it, kindly guide me, it will be a great favor.Bluebell
P
9

The problem is with input_shape. Try adding an extra dimension/channel for letting keras know that you are working on a grayscale image ie -->1

input_shape= (56,56,1). Probably if you are using a normal Deep learning model then it won't raise an issue but for Convnet it does.

Parasynthesis answered 6/2, 2019 at 18:59 Comment(0)
S
7

For reshape the data we need to add fourth dimensions i.e changing from (6000,28,28) to (6000,28,28,1)

My code is:

img_rows=x_train[0].shape[0]
img_cols=x_test[0].shape[1]

X_train=x_train.reshape(x_train.shape[0],img_rows,img_cols,1)

X_test=x_test.reshape(x_test.shape[0],img_rows,img_cols,1)


Input_shape=(img_rows,img_cols,**).  *->  I forgot to put 1 here.

I have face the same problem

Input 0 is incompatible with layer conv2d_4 : except ndim=4 ,found ndim=3

I solved this problem by simply putting value in the input shape

Input_shape=(img_rows,img_cols,1)#store the shape of single image.

With this problem is solved

Settlement answered 18/3, 2020 at 11:41 Comment(0)
H
3

you can use :

train_dataset= train_dataset.reshape(-1,32,32,1)

and now you can use input_shape(32,32,1) in the algorithm.

Hueston answered 15/2, 2021 at 17:27 Comment(2)
Rather than just posting short comments you could do this and then this as an answer, you should illustrate how this can be achieved by for example showing the code implemented in the question. As it is now, this is a comment not an answer. Consider editing your answer to give more details.Pteridology
@Hueston I need an input shape of ndim=5, But my input shape= (18, 64, 1688), so I reshaped it as: data=data.reshape(18, 64, 1688, 1, 1). And pass this to my model that contains conv2D and convLSTM2D layers. But it gives me an error: Input 0 of layer conv_lst_m2d_88 is incompatible with the layer: expected ndim=5, found ndim=6. Full shape received: (None, None, 64, 211, 1, 128). How do I resolve it, kindly guide me, it will be a great favor.Bluebell
S
1

I have faced the same problem

Input 0 is incompatible with layer conv2d_4 : except ndim=4 ,found ndim=3

I solved this problem by simply putting value in the input shape

Input_shape=(img_rows,img_cols,1)#store the shape of single image. .. & the problem is solved
Settlement answered 18/3, 2020 at 11:29 Comment(0)
A
0

Here you need to check the "channels_first" whenever CNN is used as 2d,Also reshape your train_data and test data as:

if K.image_data_format() == 'channels_first':   #check for channels_first
 train_img.reshape(train_img.shape[0],1,x,x)
 Input_shape=(1,x,x)                            #In your case x is 32
else:
 train_img.reshape(train_img.shape[0],x,x,1)
 Input_shape=(x,x,1)
Acanthocephalan answered 7/7, 2019 at 15:38 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.