Predict.model()总是返回错误的预测

时间:2019-05-31 10:28:52

标签: python tensorflow keras predict

我的目标:加载我的预训练模型并预测单个图像的概率。

我使用keras 2.2.4,tensorflow 1.12和python 3.5。

我已经使用ImageDataGenerator()对测试和验证集进行了模型训练。然后,我使用了flow_from_directory()和fit_generator()。

当我想在另一个测试集中评估模型时,我使用ImageDataGenerator()和flow_from_directory()。 model.predict_generator()给我我想要的预测,没有问题。代码是这样的:

def evaluate_my_model(test_dir,  BATCH_SIZE = 100, image_size=(175, 100)):

    Test_datagen = ImageDataGenerator(preprocessing_function=preprocess_input, samplewise_center=True,samplewise_std_normalization=True, horizontal_flip=True,fill_mode='nearest')
    # Create a generator for prediction
    Test_datagen = Test_datagen.flow_from_directory(test_dir,target_size=image_size, batch_size=BATCH_SIZE, class_mode='categorical', shuffle=False)
    # Get the predictions from the model using the generator
    _Score_predictions = model.predict_generator(Test_datagen, steps=Test_datagen.samples / Test_datagen.batch_size,  verbose=0)
    print(_Score_predictions)
    return _Score_predictions

MODEL_FILE = "/path/to/model/model.hdf5"
img_dir = "Path/to/images"
imgs = os.listdir(img_dir)
model = load_model(MODEL_FILE)
Score_predictions = evaluate_my_model(test_dir=img_dir, BATCH_SIZE=100, image_size=(175, 100))

我的问题: 当我想使用训练有素的模型来预测单个图像时,model.predict()总是返回其中一个类(我正在执行二进制分类)。我的代码如下:

MODEL_FILE = "/path/to/model/model.hdf5"
img_dir = "Path/to/images"
imgs = os.listdir(img_dir)
model = load_model(MODEL_FILE)
model.summary()
for i, img in enumerate(imgs):
    img = Image.open(img_dir+"/"+img)
    x = image.img_to_array(img)
    x = np.expand_dims(x, axis=0)
    x = preprocess_input(x)
    preds = model.predict(x)
    print(preds)

代码结果:

[[0. 1.]]
[[0. 1.]]
[[0. 1.]]
[[0. 1.]]
[[0. 1.]]
.
.
.

[预期结果]:这是我使用model.predict_generator()时的结果:

[[9.9975806e-01 2.4502163e-04]
 [1.1084620e-02 9.8872340e-01]
 [4.5869681e-05 9.9995399e-01]
 ...
 [6.5532902e-07 9.9999928e-01]
 [2.5114167e-07 9.9999976e-01]
 [9.5047617e-01 4.8345935e-02]]

那么,如何正确地将第一个代码更改为第二个代码以接收预期的结果?

1 个答案:

答案 0 :(得分:0)

我意识到问题出在哪里。我把答案放在这里,也许对其他有相同问题的人有帮助。

训练时,我使用from keras.applications.resnet50 import preprocess_input,但错误地,我使用from keras.applications.inception_v3 import InceptionV3, preprocess_input来评估模型。