ValueError:输入 0 与层 conv2d_1 不兼容:预期 ndim=4,发现 ndim=3

Posted

技术标签:

【中文标题】ValueError:输入 0 与层 conv2d_1 不兼容:预期 ndim=4,发现 ndim=3【英文标题】:ValueError: Input 0 is incompatible with layer conv2d_1: expected ndim=4, found ndim=3 【发布时间】:2019-04-14 10:04:36 【问题描述】:

在询问了已经提出的关于这个问题的问题后,我继续提出它。我试图将字母从 A 分类到 D。所有输入图像都是 64x64 和灰色。

我的CNN的第一层是:

model = Sequential()
model.add(Conv2D(32, (3,  3), input_shape = input_shape, activation = 'relu'))

input_shape 来自:

# Define the number of classes
num_classes = 4
labels_name='A':0,'B':1,'C':2,'D':3

img_data_list=[]
labels_list=[]

for dataset in data_dir_list:
    img_list=os.listdir(data_path+'/'+ dataset)
    print ('Loading the images of dataset-'+'\n'.format(dataset))
    label = labels_name[dataset]
    for img in img_list:
    input_img=cv2.imread(data_path + '/'+ dataset + '/'+ img )
          input_img=cv2.cvtColor(input_img, cv2.COLOR_BGR2GRAY)
          input_img_resize=cv2.resize(input_img,(128,128))
          img_data_list.append(input_img_resize)
          labels_list.append(label)

img_data = np.array(img_data_list)
img_data = img_data.astype('float32')
img_data /= 255
print (img_data.shape)

labels = np.array(labels_list)
print(np.unique(labels,return_counts=True))

#convert class labels to on-hot encoding
Y = np_utils.to_categorical(labels, num_classes)

#Shuffle the dataset
x,y = shuffle(img_data,Y, random_state=2)

# Split the dataset
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=2)

#Defining the model
input_shape=img_data[0].shape
print(input_shape)

【问题讨论】:

input_shape的值是多少? input_shape=img_data[0].shape 和 img_data 来自input_shape=img_data[0].shape 【参考方案1】:

Conv2d 需要输入形状(batchsize、w、h、过滤器)。

您需要在 conv 层之前添加一个 reshape 以适应数据:

 model.add(Reshape((64, 64, 1)))

这会将您的模型尺寸设置为 [None, 64,64,1] 并且对于 Conv2d 应该没问题。

【讨论】:

【参考方案2】:

CNN 模型在使用多层(卷积层和池化)时需要维度更大的数据集。为了避免负维度问题,增加图像维度或减少 CNN 层。它有效..

【讨论】:

以上是关于ValueError:输入 0 与层 conv2d_1 不兼容:预期 ndim=4,发现 ndim=3的主要内容,如果未能解决你的问题,请参考以下文章

conv2d 层的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 1,但接收到形状为 [None, 64, 64, 3] 的输入

ValueError:输入 0 与层 lstm_13 不兼容:预期 ndim=3,发现 ndim=4

ValueError:输入 0 与层 lstm_1 不兼容:预期 ndim=3,发现 ndim=2 [keras]

如何修复'ValueError:输入0与层simple_rnn_1不兼容:预期形状=(无,无,20),找到形状=(无,无,2,20)'

ValueError:层顺序的输入 0 与层不兼容:输入形状的预期轴 -1 具有值 3,但接收到的输入具有形状

ValueError: 层 lstm_12 的输入 0 与层不兼容:预期 ndim=3,发现 ndim=4