在使用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(),但我想了解我在这里做错了什么。
答案 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'。