如何使用Keras中保存的模型来预测和分类单个图像?

时间:2017-07-12 07:24:45

标签: image-processing machine-learning keras

我用Keras训练了一个图像分类器,最后我用代码

保存了模型

model.save('model1.h5')

现在,当我实际尝试使用此模型预测另一张图片时,我正在使用该代码

from keras.models import load_model
from keras.preprocessing import image
import numpy as np

# dimensions of our images
img_width, img_height = 231, 172

# load the model we saved
model = load_model('model1.h5')
model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])

# predicting images
img = image.load_img('a.png', target_size=(img_width, img_height))
x = image.img_to_array(img)
x = np.expand_dims(x, axis=0)

images = np.vstack([x])
classes = model.predict_classes(images, batch_size=10)
print(classes)

我收到错误

  

ValueError:检查时出错:预期conv2d_1_input具有形状(无,231,172,1)但是具有形状的数组(1,231,172,3)

我使用的图像都是GrayScale模式,所以我知道我需要将3更改为1,但我不确定如何使用此代码?

另外,当我训练图像时,我设置了

train_datagen = ImageDataGenerator(rescale=1. / 255)
test_datagen = ImageDataGenerator(rescale=1. / 255)

但我不确定在哪里放置代码重新缩放它,如果它甚至需要

另外,我设置了

batch_size = 16

我在代码中看到预测我把

classes = model.predict_classes(images, batch_size=10)

我是否应该将batch_size更改为16?或者只是把它留在10?

再次感谢你们!

2 个答案:

答案 0 :(得分:1)

首先,要以灰度模式加载图像,只需添加grayscale=True,如下所示:

img = image.load_img('a.png', target_size=(img_width, img_height), grayscale=True)

其次,将img转换为numpy数组后,只需将x除以255.即可重新缩放。

第三,batch_size参数表示完成计算的批次有多大。由于您对单个图像进行预测,因此您定义的batch_size并不重要。以下是Keras documentation关于batch_size推断的内容:

  

对于推理(评估/预测),建议选择一个尽可能大的批量大小,而不会耗尽内存(因为较大的批次通常会导致更快的评估/预测)。

最后,在加载模型进行推理时无需编译模型。您可以安全地删除model.compile(...)

答案 1 :(得分:0)

可能错误就在这里。

img = image.load_img('a.png', target_size=(img_width, img_height))

如果训练模型中的target_size为(64,64)。

预测期间的目标大小应为(64,64)而不是(img_width,img_height)