Keras model.predict检查输入时出错:预期conv2d_input具有4维,但数组的形状为(128,56)

时间:2018-12-03 23:37:49

标签: python tensorflow keras

我使用DirectoryIterator从目录中读取图像并训练了我的模型。我希望能够验证它是否起作用,因此我尝试在包含图像的numpy数组上使用model.predict,但是出现以下错误

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

我不确定DirectoryIteratory中的flow_from_directory具有哪种形状或属性,因此不确定model.predict期望得到什么样的输入。这是我的代码的样子

train_datagen = ImageDataGenerator(
    rescale=1. / 255,
    shear_range=0.2,
    zoom_range=0.2,
    horizontal_flip=True)

test_datagen = ImageDataGenerator(rescale=1. / 255)

train_generator = train_datagen.flow_from_directory(
    train_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

validation_generator = test_datagen.flow_from_directory(
    validation_data_dir,
    target_size=(img_width, img_height),
    batch_size=batch_size,
    class_mode='binary')

model.fit_generator(
    train_generator,
    steps_per_epoch=nb_train_samples // batch_size,
    epochs=epochs,
    validation_data=validation_generator,
    validation_steps=nb_validation_samples // batch_size)

1 个答案:

答案 0 :(得分:1)

在您的代码段中,您似乎正在使用this博客文章。因此,ConvNet的第一层是卷积层,期望输入形状为(150, 150)。让我们看看您的错误消息:

  

ValueError :检查输入时出错:预期conv2d_input具有4   尺寸,但数组的形状为(128,56)

该错误说明两件事:

  1. 您的输入应具有4个维度。
  2. 形状为(128,56)的数组。

因此,首先,您的numpy数组形状应为(150, 150)的形状(由于ConvNet的输入形状),并且应将图像的尺寸扩展为4个尺寸。例如(假设您的numpy数组为x):

x = x.reshape(1,150,150,3).astype('float')
x /= 255

pred = model.predict(x)

如果要从硬盘读取图像,则可以使用以下代码:

img = keras.preprocessing.image('image.jpg', target_size=(150,150))
x = keras.preprocessing.image.img_to_array(img)
x = x.reshape(1,150,150,3).astype('float')
x /= 255

pred = model.predict(x)

希望有帮助。