我已经搜索了与此相关的所有解决方案,但仍然不知道如何调整我的训练数据,以便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转换层中使用通道,以及重新调整图像本身以无济于事。有什么建议吗?
答案 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)