在使用ImageDataGenerator(1./255)训练的模型进行预测之前,是否需要重新缩放图像?

时间:2019-06-16 04:31:53

标签: keras

在使用ImageDataGenerator(1/255。)训练模型后,是否需要在预测之前重新缩放图像? 我以为有必要,但实验结果说不。

我训练了Resnet50模型,该模型在顶层具有37个类。 像这样使用ImageDataGenerator对模型进行训练。

datagen = ImageDataGenerator(rescale=1./255)
generator=datagen.flow_from_directory(
    directory=os.path.join(os.getcwd(), data_folder),
    target_size=(224,224),
    batch_size=256,
    classes=None,
    class_mode='categorical')

history = model.fit_generator(generator, steps_per_epoch=generator.n / 256, epochs=10)

在我的火车数据集上经过10个纪元后,准确性达到了98%。 问题是,当我尝试预测TRAIN数据集中的每个图像时,预测是错误的(无论输入的图像是33个,结果都是

img_p = './data/pets/shiba_inu/shiba_inu_27.jpg'
img = cv2.imread(img_p, cv2.IMREAD_COLOR)
img = cv2.resize(img, (224,224))

img_arr = np.zeros((1,224,224,3))
img_arr[0, :, :, :] = img / 255.
pred = model.predict(img_arr)
yhat = np.argmax(pred, axis=1)

yhat是5,但y是33

当我替换此行

img_arr[0, :, :, :] = img / 255.

以此

img_arr[0, :, :, :] = img

刚好33岁。

有人可能建议使用predict_generator()而不是predict(),但我想了解我在这里做错了什么。

3 个答案:

答案 0 :(得分:0)

您必须对训练数据进行每个预处理,然后对要馈送到训练网络的每个数据进行预处理。实际上,例如,当您重新缩放火车图像并训练网络时,您的网络火车将获得一个矩阵,矩阵的条目介于0和1之间,并找到合适的类别。因此,如果在训练阶段之后无需重新缩放就可以提供图像,则可以将经过训练的网络的条目输入0到255之间的矩阵,而您的网络却不知道如何处理该矩阵。

答案 1 :(得分:0)

我知道这里出了什么问题。

我正在使用Imagenet预训练模型,该模型不会通过将其划分为255来重新缩放图像。我必须在训练/测试之前使用resnet50.preprocess_input。

preprocess_input函数可以在这里找到。 https://github.com/keras-team/keras-applications/blob/master/keras_applications/imagenet_utils.py

答案 2 :(得分:0)

如果您要按照与培训时完全相同的方式进行预处理,那么您可能会使用yhat = np.argmax(pred, axis=1)查看代码中预测课程的部分,我的直觉是可能存在类不匹配的情况。根据索引,使用flow_from_directory时要检查类的索引,请使用class_map = generator.class_indices,这将返回一个字典,该字典将向您显示如何根据索引映射类。

注意:之所以这么说是因为我遇到了类似的问题,使用Keras flow_from_directory不能对类进行排序,因此,您的预测类1很可能位于索引10上,而{{1} }将返回您的班级1'。