Python 使用model.predict()进行错误预测

Python 使用model.predict()进行错误预测,python,keras,predict,Python,Keras,Predict,我在VGG16网络中进行预测时遇到问题。我有一个模特和亚当一起上了7节课。使用fit_generator()和ImageDataGenerator对其进行培训。我使用以下方式加载模型: # load the model we saved model = load_model('models/vgg16_9.h5') model.compile(loss='categorical_crossentropy', optimizer=optimizers.Adam(lr=1

我在VGG16网络中进行预测时遇到问题。我有一个模特和亚当一起上了7节课。使用fit_generator()和ImageDataGenerator对其进行培训。我使用以下方式加载模型:

# load the model we saved
model = load_model('models/vgg16_9.h5')
model.compile(loss='categorical_crossentropy',
              optimizer=optimizers.Adam(lr=1e-4),
              metrics=['acc'])
然后试图做出预测。首先,我使用predict_generator()生成一个.CSV文件,其中包含以下结果:

test_datagen = ImageDataGenerator(rescale = 1./255)
test_generator = test_datagen.flow_from_directory("dataset/test_set",
                                                  target_size=(227, 454),
                                                  batch_size=1,
                                                  class_mode=None,
                                                  shuffle=False,
                                                  seed=42)

test_generator.reset()
pred = model.predict_generator(test_generator, verbose = 1)
predicted_class_indices = np.argmax(pred, axis = 1)

labels = (valid_generator.class_indices)
labels = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]

filenames=test_generator.filenames
results=pd.DataFrame({"Filename":filenames,
                      "Predictions":predictions})
results.to_csv("results.csv",index=False)
它工作正常,我得到的结果如下:

...
Filename,Predictions
test\green.1191.png,Green
test\green.1195.png,Green
test\green.1196.png,Green
test\green.1197.png,Green
test\green.1198.png,OK
test\green.1199.png,Green
test\green.1200.png,Green
test\green.1201.png,Green
test\green.1202.png,OK
test\green.1203.png,Green
test\green.1204.png,OK
test\green.1205.png,Green
test\green.1206.png,Green
test\green.1207.png,Green
...
但当我尝试用以下方法进行单图像预测时:

# predicting images
test_image = image.load_img('dataset/test_set/test/green.1230.png', target_size = (227, 454))
test_image = image.img_to_array(test_image)
test_image = np.expand_dims(test_image, axis = 0)
result = model.predict(test_image, verbose=1)
y_pred = np.argmax(result, axis = 1)
我的y_pred是[6],如果我正确地阅读了class_索引,那么[6]就是另一个类(predict_generator()做得很好)

类别指数:

class_names = (valid_generator.class_indices)

class_names = dict((v,k) for k,v in class_names.items())
class_names_list = []
temp = []

for key, value in class_names.items():
    temp = value
    class_names_list.append(temp)
给我:

{0: 'Green', 1: 'Half', 2: 'Moldy', 3: 'NoEmbryo', 4: 'OK', 5: 'Organic', 6: 'Stones'}

我做错了什么?

您的问题可能源于python dict到list的转换。 当您的预测来自predict_generator()时,它将从一个dict by key中进行选择

在第二个示例中,您将其转换为一个列表,并使用列表的索引,这将是另一个结果

我真的不明白这样做的目的是什么:

for key, value in class_names.items():
    temp = value
    class_names_list.append(temp)
但是如果您从class_names_列表中得到类结果,您将得到错误的结果。因此:

y_pred = np.argmax(result, axis = 1)
class_names[y_pred]

应该为您提供正确的值。

是新图像吗?或者是一张分类正确的培训图片?我将整个数据集分为3部分:-培训集-验证集-测试集->这部分的图片,没有参加培训或评估,那么问题出在哪里?有些图像将被预测失误。如果它们都是预测失误,那就是一个问题。为什么一个错误的分类对你来说是一个问题?没有问题,你只是没有通过乘以1/255.0来规范化图像,而生成器正在为你做这件事。我应该做什么呢?@MichaelS。请参阅我的更新和评论,以便进一步了解