¿Cómo obtener predicciones con predict_generator en la transmisión de datos de prueba en Keras?

16

En el blog de Keras sobre capacitación de redes de comunicación desde cero , el código muestra solo la red que se ejecuta en datos de capacitación y validación. ¿Qué pasa con los datos de prueba? ¿Los datos de validación son los mismos que los datos de prueba (creo que no)? Si hubiera una carpeta de prueba separada en líneas similares a las carpetas de tren y validación, ¿cómo obtenemos una matriz de confusión para los datos de prueba? Sé que tenemos que usar scikit learn o algún otro paquete para hacer esto, pero ¿cómo obtengo algo similar a las probabilidades de clase para los datos de prueba? Espero usar esto para la matriz de confusión.

Raghuram
fuente
1
Puede llamar a la función model.predict_generator (...) con un generador que lee datos de un directorio que contiene el conjunto de pruebas. Devuelve las predicciones, que puede usar para calcular una matriz de confusión. ¿Es eso lo que estás buscando? Ver aquí para documentos: keras.io/models/sequential
stmax
1
Sí, lo vi. predic_generator devuelve una lista de predicciones que es una lista de valores flotantes entre 0 y 1. ¿Cómo interpreto esto? No se puede usar directamente con la matriz de confusión.
Raghuram
2
Todavía no he intentado predict_generator (es bastante nuevo), pero parece devolver las probabilidades de clase. Intente convertir los valores <= 0.5 a 0 y> 0.5 a 1. Una vez que tenga una lista que consta de 0s y 1s, puede alimentarla a la función para calcular la matriz de confusión.
stmax
2
Por otro lado, esto funcionará bien para problemas de dos clases, pero ¿qué pasa si hay más de dos clases?
Raghuram
1
Si hay más de dos clases, su red necesita más de una salida. Para n clases, tiene n salidas y predice la clase que tiene la salida más alta. Eche un vistazo a la función softmax ( en.wikipedia.org/wiki/Softmax_function ).
stmax

Respuestas:

15

Para obtener una matriz de confusión de los datos de prueba, debe seguir dos pasos:

  1. Hacer predicciones para los datos de prueba

Por ejemplo, use model.predict_generatorpara predecir las primeras 2000 probabilidades del generador de prueba.

generator = datagen.flow_from_directory(
        'data/test',
        target_size=(150, 150),
        batch_size=16,
        class_mode=None,  # only data, no labels
        shuffle=False)  # keep data in same order as labels

probabilities = model.predict_generator(generator, 2000)
  1. Calcule la matriz de confusión basada en las predicciones de la etiqueta.

Por ejemplo, compare las probabilidades con el caso de que hay 1000 gatos y 1000 perros respectivamente.

from sklearn.metrics import confusion_matrix

y_true = np.array([0] * 1000 + [1] * 1000)
y_pred = probabilities > 0.5

confusion_matrix(y_true, y_pred)

Nota adicional sobre datos de prueba y validación

La documentación de Keras utiliza tres conjuntos diferentes de datos: datos de entrenamiento, datos de validación y datos de prueba. Los datos de entrenamiento se utilizan para optimizar los parámetros del modelo. Los datos de validación se utilizan para elegir los metaparámetros, por ejemplo, el número de épocas. Después de optimizar un modelo con metaparámetros óptimos, los datos de prueba se utilizan para obtener una estimación justa del rendimiento del modelo.

Pieter
fuente
2
Gracias por los fragmentos de código. ¿Podrías vincular a esos dos? En su ejemplo, y_true parece estar poblado con datos ficticios. ¿Usarías generator.classes para llenar la matriz?
Gegenwind
No estoy seguro, pero creo que en lugar de np.array([0] * 1000 + [1] * 1000)ti puedes obtener la misma matriz haciendogenerator.classes
Mehdi Nellen el
2

Aquí hay un código que probé y funcionó para mí:

pred= model.predict_generator(validation_generator, nb_validation_samples // batch_size)
predicted_class_indices=np.argmax(pred,axis=1)
labels = (validation_generator.class_indices)
labels2 = dict((v,k) for k,v in labels.items())
predictions = [labels[k] for k in predicted_class_indices]
print(predicted_class_indices)
print (labels)
print (predictions)

Entonces puedes usar:

print (confusion matrix(predicted_class_indices,labels)

Asegúrese de usarlo shuffle=Falseen su generador de prueba (en mi caso es el generador de validación) y reinícielo validation_generator.reset()antes de hacer sus predicciones.

ranahd
fuente
0

Para la matriz de confusión, debe usar el paquete sklearn. No creo que Keras pueda proporcionar una matriz de confusión. Para predecir valores en el conjunto de prueba, simplemente llame al método model.predict () para generar predicciones para el conjunto de prueba. El tipo de valores de salida depende del tipo de modelo, es decir, ya sea discreto o de probabilidades.

enterML
fuente
Gracias por la respuesta. Sé que Keras no tiene su propio paquete de matriz de confusión. Mi pregunta es que model.predict_generator devuelve una lista de valores flotantes que no se pueden usar para calcular la matriz de confusión.
Raghuram
¿Con qué tipo de datos estás experimentando?
enterML
Estoy trabajando en imagenes.
Raghuram