Модель Keras получает высокую точность в обучении и валидации, а затем путается в метрике Confusion - PullRequest
1 голос
/ 01 октября 2019

Итак, у меня есть бинарная классификационная модель, которая дает действительно хорошие оценки на этапах проверки и тестирования обучения.

validation_generator.reset # reset the validation gen for testing
loss: 0.0725 - accuracy: 0.9750 - val_loss: 0.1703 - val_accuracy: 0.9328
scores = model.evaluate_generator(validation_generator, workers=1, use_multiprocessing=False, verbose=1)
print(scores)
[0.023366881534457207, 0.9353214502334595]

Хорошо, так это выглядит очень хорошо для меня, правильно? Теперь, когда я пробую метрики путаницы, все это группируется в один класс, что совершенно неверно.

Confusion Matrix
[[1045    0]
[1537    0]]

Вот код CM:

validation_generator.reset
Y_pred = model.predict_generator(validation_generator, validation_generator.samples // BATCH_SIZE+1)
y_pred = np.argmax(Y_pred, axis=1)
print(confusion_matrix(validation_generator.classes, y_pred))
target_names = ['male', 'female']
print(classification_report(validation_generator.classes, y_pred, target_names=target_names))

Этого не должно быть, я не думаю. Возможно, с генераторами, но для меня это выглядит правильно.

BATCH_SIZE = 32
train_datagen = ImageDataGenerator(preprocessing_function=preprocess_input,
                               horizontal_flip=True,                            
                               validation_split=0.2) # set validation split

train_generator = train_datagen.flow_from_directory(
    DATA_PATH,
    target_size=(224, 224),
    shuffle=True,
    batch_size=BATCH_SIZE,
    class_mode='binary',
    subset='training') # set as training data

validation_generator = train_datagen.flow_from_directory(
    DATA_PATH, # same directory as training data
    target_size=(224, 224),
    batch_size=BATCH_SIZE,
    shuffle=False,
    class_mode='binary',
    subset='validation') # set as validation data

Должен ли я установить размер пакета проверки равным 1?

Вот объявление модели, если это поможет.

history = model.fit_generator(
    train_generator,
    steps_per_epoch = train_generator.samples // BATCH_SIZE,
    validation_data = validation_generator, 
    validation_steps = validation_generator.samples // BATCH_SIZE,
    epochs = EPOCHS,
    verbose=1, 
    callbacks=callbacks_list)

ОБНОВЛЕНИЕ И ИСПРАВЛЕНИЕ ДЛЯ ЭТОЙ ПРОБЛЕМЫ:

Добавьте это к коду

y_pred[y_pred <= 0.5] = 0.
y_pred[y_pred > 0.5] = 1.
#Old code
#y_pred = np.argmax(Y_pred, axis=1) # This does not work for this

1 Ответ

1 голос
/ 01 октября 2019

Насколько я понимаю, вы делаете двоичную классификацию, и я вижу в вашем коде, что вы используете np.argmax(Y_pred, axis=1). Я думаю, что argmax следует использовать с классификацией нескольких классов.

Для решения, вы должны попробовать что-то вроде y_pred = [y[0] >= 0.5 for y in y_pred]

Обратите внимание, что я не уверен, что этот код работает точно или нет, но я уверен, что np.argmax() нужно заменить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...