Evaluación de clasificadores de imágenes

Aprendizaje profundo intermedio con PyTorch

Michal Oleszak

Machine Learning Engineer

Aumento de datos en el momento de la prueba

Aumento de datos para datos de entrenamiento:

train_transforms = transforms.Compose([
    transforms.RandomHorizontalFlip(),
    transforms.RandomRotation(45),
    transforms.RandomAutocontrast(),
    transforms.ToTensor(),
    transforms.Resize((64, 64)),
])

dataset_train = ImageFolder(
  "clouds_train", 
  transform=train_transforms,
)

Aumento de datos para datos de prueba:

test_transforms = transforms.Compose([
    #
    # NO DATA AUGMENTATION AT TEST TIME
    #
    transforms.ToTensor(),
    transforms.Resize((64, 64)),
])

dataset_test = ImageFolder(
  "clouds_test", 
  transform=test_transforms,
)
Aprendizaje profundo intermedio con PyTorch

Precisión y recuperación: clasificación binaria

En la clasificación binaria:

  • Precisión Fracción de predicciones positivas correctas
  • Sensibilidad o exhaustividad (también conocida como recall): Fracción de todos los ejemplos positivos predichos correctamente

Una matriz de confusión de 2 por 2 con cada uno de los cuatro campos marcados en un color diferente; junto a ella, se expresan las fórmulas de recuperación y precisión en términos de los códigos de color.

Aprendizaje profundo intermedio con PyTorch

Precisión y recuperación: clasificación multiclase

En la clasificación multiclase: separa la precisión y la recuperación para cada clase.

  • Precisión Fracción de predicciones de cúmulos que fueron correctas
  • Sensibilidad o exhaustividad (también conocida como recall): Fracción de todos los ejemplos de cúmulos predichos correctamente

 

Imagen de una nube cúmulo

Aprendizaje profundo intermedio con PyTorch

Promedio de métricas multiclase

  • Con 7 clases, tenemos 7 puntuaciones de precisión y 7 de recuperación.
  • Podemos analizarlos por clase o agregarlos:
    • Media micro: cálculo global
    • Media macro: media de las métricas por clase.
    • Media ponderada: media ponderada de las métricas por clase.
Aprendizaje profundo intermedio con PyTorch

Promedio de métricas multiclase

from torchmetrics import Recall

recall_per_class = Recall(task="multiclass", num_classes=7, average=None)
recall_micro = Recall(task="multiclass", num_classes=7, average="micro")
recall_macro = Recall(task="multiclass", num_classes=7, average="macro")
recall_weighted = Recall(task="multiclass", num_classes=7, average="weighted")

Cuándo utilizar cada uno:

  • Micro: Conjuntos de datos desequilibrados
  • Macro: Preocupación por el rendimiento en clases reducidas
  • Ponderado: Considera los errores en clases más grandes como más importantes.
Aprendizaje profundo intermedio con PyTorch

Bucle de evaluación

from torchmetrics import Precision, Recall

metric_precision = Precision(
  task="multiclass", num_classes=7, average="macro"
)
metric_recall = Recall(
  task="multiclass", num_classes=7, average="macro"
)

net.eval() with torch.no_grad(): for images, labels in dataloader_test:
outputs = net(images) _, preds = torch.max(outputs, 1) metric_precision(preds, labels) metric_recall(preds, labels)
precision = metric_precision.compute() recall = metric_recall.compute()
  • Importar y definir métricas de precisión y recuperación
  • Repite los ejemplos de prueba sin gradiente.
  • Para cada lote de prueba, obtén los resultados del modelo, toma la clase más probable y pásala a las funciones métricas junto con las etiquetas.
  • Calcular las métricas
print(f"Precision: {precision}")
print(f"Recall: {recall}")
Precision: 0.7284010648727417
Recall: 0.763038694858551
Aprendizaje profundo intermedio con PyTorch

Análisis del rendimiento por clase

metric_recall = Recall(
  task="multiclass", num_classes=7, average=None
)
net.eval()
with torch.no_grad():
    for images, labels in dataloader_test:
        outputs = net(images)
        _, preds = torch.max(outputs, 1)
        metric_recall(preds, labels)
recall = metric_recall.compute()
print(recall)
tensor([0.6364, 1.0000, 0.9091, 0.7917, 
        0.5049, 0.9500, 0.5493],
       dtype=torch.float32)
  • Calcular métrica con average=None
  • Esto da una puntuación por clase.
  • DatasetEl atributo ' .class_to_idx ' asigna nombres de clase a índices.
dataset_test.class_to_idx
{'cirriform clouds': 0,
 'clear sky': 1,
 'cumulonimbus clouds': 2,
 'cumulus clouds': 3,
 'high cumuliform clouds': 4,
 'stratiform clouds': 5,
 'stratocumulus clouds': 6}
Aprendizaje profundo intermedio con PyTorch

Análisis del rendimiento por clase

{
  k: recall[v].item() 
  for k, v 
  in dataset_test.class_to_idx.items()
}
{'cirriform clouds': 0.6363636255264282,
 'clear sky': 1.0,
 'cumulonimbus clouds': 0.9090909361839294,
 'cumulus clouds': 0.7916666865348816,
 'high cumuliform clouds': 0.5048543810844421,
 'stratiform clouds': 0.949999988079071,
 'stratocumulus clouds': 0.5492957830429077}
  • k = nombre de la clase, p. ej. cirriform clouds
  • v = índice de clase, p. ej. 0
  • recall[v] = tensor(0.6364, dtype=torch.float32)
  • recall[v].item() = 0.6364
Aprendizaje profundo intermedio con PyTorch

¡Vamos a practicar!

Aprendizaje profundo intermedio con PyTorch

Preparing Video For Download...