¿Está ordenado el método .classes de un generador de datos de imágenes?

Resuelto weizer asked hace 1 año • 0 respuestas

Estoy tratando de crear un CM, tengo mi y_pred y obviamente necesito mis verdades básicas, o estoy tratando de usar testdata.classes (esto es lo que hacen en línea, testdata es una instancia de imagedatagenerator).

Sin embargo, .classes parece simplemente devolver una lista ordenada de todas mis clases en lugar de una lista de clases que corresponderían a mis predicciones. Debido a esto creo que obtengo un CM muy inexacto. ¿Cómo puedo obtener las verdades básicas de mis predicciones?

Aquí hay un ejemplo de lo que quiero decir con las .clases, esta lista va en orden del 0 al 15. Por cierto, mi modelo tiene una precisión del 95%, por lo que esperaría que se alinearan mucho mejor.

Esperaría que y_pred y dataset.classes fueran iguales el 95% del tiempo.

ingrese la descripción de la imagen aquí

weizer avatar Nov 09 '22 05:11 weizer
Aceptado

Este es un problema común.

generator.classesno deben usarse como etiquetas de verdad fundamental, porque no están ordenadas de la misma manera que se obtendrían las predicciones. Por lo tanto, cualquier métrica que calcules será incorrecta.

Una forma general y correcta de hacerlo es iterar sobre el generador, asumiendo que es una subclase de Sequence:

all_y_pred = []
all_y_true = []

for i in range(len(generator)):
    x, y = generator[i]
    y_pred = model.predict(x)
    
    all_y_pred.append(y_pred)
    all_y_true.append(y)

all_y_pred = np.concatenate(all_y_pred, axis=0)
all_y_true = np.concatenate(all_y_true, axis=0)

metric = compute_your_metric(all_y_true, all_y_pred)

Como puede ver, necesita iterar en el generador, calcular las predicciones por lote, y en cada lote también obtiene acceso a las etiquetas verdaderas, de modo que puede acumular ambas en algunas listas y luego combinarlas para calcular la métrica deseada.

Dr. Snoopy avatar Nov 12 '2022 09:11 Dr. Snoopy