我用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?
再次感谢你们!
答案 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)