Keras ValueError: 输入0与层conv2d_1不兼容:期望ndim = 4,但发现ndim = 5。

63

我已经检查了所有解决方案,但仍然面临着相同的错误。我的训练图像形状是(26721, 32, 32, 1),我相信它是四维的,但我不知道为什么错误显示它是五维的。

 model = Sequential()

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

这就是我对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)
6个回答

69

问题在于input_shape

它实际上应该只包含 3 个维度。而内部 keras 会添加批量维度,使其变成 4 个维度。

由于您可能使用了带有 4 个维度(包括批量)的input_shape,因此 keras 正在添加第5个维度。

您应该使用 input_shape=(32,32,1)


2
不,那个数字是空闲的。例如,在model.summary()中,Keras会将该维度显示为None - Daniel Möller
3
我的训练数据维度是 (26721, 32, 32),验证数据的维度是 (6680, 32, 32)。现在我明确定义图像大小为 (32, 32, 1),然后它给我一个错误:ValueError: Error when checking input: expected conv2d_9_input to have 4 dimensions, but got array with shape (6680, 32, 32)。我还在帖子中编辑了 model_fit.generator,请你检查一下那里。 - Lucky
6
现在问题出在你的数据上。你的数据缺少 channel 维度:x_validation = x_validation.reshape(6680,32,32,1) - Daniel Möller
2
非常感谢您的帮助。 - Lucky
你能帮我们解决这个问题吗,@DanielMöller。https://stackoverflow.com/questions/64612084/valueerror-input-0-of-layer-sequential-157-is-incompatible-with-the-layer-expe - Brown
@DanielMöller 我需要一个ndim=5的输入形状,但是我的输入形状=(18, 64, 1688),所以我将其reshape为:data=data.reshape(18, 64, 1688, 1, 1)。然后将其传递给包含conv2D和convLSTM2D层的模型。但它给了我一个错误: conv_lst_m2d_88层的Input 0与该层不兼容:期望ndim=5,发现ndim=6。完整接收到的形状是:(None, None, 64, 211, 1, 128)。请问如何解决这个问题,指导一下,这将是一个很大的帮助。 - TariqS

9
问题出在input_shape上。尝试添加一个额外的维度/通道,让keras知道你正在处理一张灰度图像,即-->1input_shape= (56,56,1)。 如果您使用的是普通的深度学习模型,则可能不会出现问题,但对于卷积神经网络来说,它会出现问题。

7
为了重新塑造数据,我们需要增加第四个维度,即从(6000,28,28)更改为(6000,28,28,1) 我的代码如下:
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.

我遇到了同样的问题。

输入0与conv2d_4层不兼容: 期望维数为4,但找到维数为3

我通过在输入形状中简单地放置值来解决了这个问题。

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

这个问题已经得到解决。

3

您可以使用:

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

现在,您可以在算法中使用 input_shape(32,32,1)。


4
与其只是发表简短的评论“你可以这样做,然后再这样做”作为答案,你应该通过例如展示在问题中实现的代码来说明如何实现此操作。目前这只是一个评论,而不是一个回答。请考虑编辑您的答案以提供更多详细信息。 - Oliver
@Sanketsz 我需要一个ndim=5的输入形状,但我的输入形状为(18, 64, 1688),所以我将其重新塑造为:data=data.reshape(18, 64, 1688, 1, 1)。并将其传递给包含conv2D和convLSTM2D层的模型。但是它会给我一个错误:conv_lst_m2d_88层的第0个输入与该层不兼容:预期ndim=5,发现ndim=6. 收到的完整形状为:(None, None, 64,211,1,128)。请问我该如何解决这个问题?请指导我,这将是一件大事。 - TariqS

1

我遇到了同样的问题

输入0与卷积层conv2d_4不兼容:期望ndim=4,但发现ndim=3

我通过在输入形状中简单地放置值来解决了这个问题

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

0

在使用CNN作为2D时,您需要检查"channels_first"。此外,将您的train_data和test data重塑为:

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)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接