输入层的TensorFlow Keras尺寸错误

时间:2020-02-03 02:07:57

标签: python tensorflow keras conv-neural-network

我已经搜索了与此相关的所有解决方案,但仍然不知道如何调整我的训练数据,以便Tensorflow接受它。

我的训练数据是一个形状为numpy的数组(21005、48、48),其中21005是元素数,而48,48是48x48灰度图像。

model.add(tf.keras.layers.Conv2D(64, kernel_size=3,activation='relu',input_shape=(48,48,1)))
model.add(tf.keras.layers.Conv2D(32, kernel_size=3,activation='relu'))
model.add(tf.keras.layers.Flatten())
model.add(tf.keras.layers.Dense(7, activation='softmax'))

model.compile(optimizer='adam',
              loss = 'sparse_categorical_crossentropy',
              metrics=['accuracy'])

model.fit(image_train, emotion_train,batch_size=BATCH_SIZE,epochs=EPOCHS, verbose=1)

但是,当我运行fit函数时,它会返回错误说明:

ValueError: Error when checking input: expected conv2d_input to have 4 dimensions, but got array with shape (21005, 48, 48)

这使我认为我格式化输入数据的格式不正确,或者缺少有关Keras和TF如何实际将输入图像传递到输入层的某些信息。我尝试将额外的尺寸添加到输入形状中,以允许在2d转换层中使用通道,以及重新调整图像本身以无济于事。有什么建议吗?

2 个答案:

答案 0 :(得分:2)

重塑您的训练数据,以便在调用model.fit()之前具有4维,例如:

image_train = np.reshape(image_train, (21005, 48, 48, 1))

这是必需的,因为第一Conv2D层期望图像的input_shape为(48,48,1)

答案 1 :(得分:1)

进行预处理时,您可能已经使用OpenCV / PIL库以灰度模式读取了图像。

在阅读它们时,您的图书馆会考虑使用大小为(48,48)的灰度图像,而不是大小为(48,48,1)的灰度图像,因此会出现问题。

尽快解决问题,而不是在解决问题之前;在您的代码中,无论您在何处阅读这些图像,在追加到列表/数组之前,请确保选择正确的数组形状。您可以在OpenCV示例下面查看:

image = cv2.imread(filepath, 0)
#Before this np_expand_dims, image has shape (48,48)
image = np.expand_dims(image , axis=2)
#After this step, image has shape (48,48,1)