Contamos con la mejor solución que hallamos en internet. Nosotros esperamos que te resulte útil y si quieres comentarnos alguna mejora hazlo libremente.
Solución:
Aquí se explica cómo obtener la matriz de confusión (o tal vez estadísticas usando scikit-learn) para todas las clases:
1.Predecir clases
test_generator = ImageDataGenerator()
test_data_generator = test_generator.flow_from_directory(
test_data_path, # Put your path here
target_size=(img_width, img_height),
batch_size=32,
shuffle=False)
test_steps_per_epoch = numpy.math.ceil(test_data_generator.samples / test_data_generator.batch_size)
predictions = model.predict_generator(test_data_generator, steps=test_steps_per_epoch)
# Get most likely class
predicted_classes = numpy.argmax(predictions, axis=1)
2.Obtenga clases y etiquetas de clase reales
true_classes = test_data_generator.classes
class_labels = list(test_data_generator.class_indices.keys())
3. Usa scikit-learn para obtener estadísticas
report = metrics.classification_report(true_classes, predicted_classes, target_names=class_labels)
print(report)
Usted puede leer más aquí
EDITAR: si lo anterior no funciona, mire este video Crear matriz de confusión para predicciones del modelo Keras. Probablemente revise los comentarios si tiene un problema. O haga predicciones con un clasificador de imágenes Keras CNN
¿Por qué la función scikit-learn no haría el trabajo? Reenvía todas sus muestras (imágenes) en el conjunto de prueba/entrenamiento, convierte una codificación en caliente en codificación de etiquetas (ver enlace) y la pasa a sklearn.metrics.confusion_matrix
como y_pred
. Se procede de manera similar con y_true
(uno caliente para etiquetar).
Código de muestra:
import sklearn.metrics as metrics
y_pred_ohe = KerasClassifier.predict(X) # shape=(n_samples, 12)
y_pred_labels = np.argmax(y_pred_ohe, axis=1) # only necessary if output has one-hot-encoding, shape=(n_samples)
confusion_matrix = metrics.confusion_matrix(y_true=y_true_labels, y_pred=y_pred_labels) # shape=(12, 12)
Aquí gatos y perros son las etiquetas de clase:
#Confusion Matrix and Classification Report
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
Y_pred = model.predict_generator(validation_generator, nb_validation_samples //
batch_size+1)
y_pred = np.argmax(Y_pred, axis=1)
print('Confusion Matrix')
print(confusion_matrix(validation_generator.classes, y_pred))
print('Classification Report')
target_names = ['Cats', 'Dogs']
print(classification_report(validation_generator.classes, y_pred, target_names=target_names))
Acuérdate de que tienes la opción de decir si te fue preciso.