이미지 분류기 평가

PyTorch로 배우는 Intermediate Deep Learning

Michal Oleszak

Machine Learning Engineer

테스트 시 데이터 증강

훈련 데이터 증강:

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,
)

테스트 데이터 증강:

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

dataset_test = ImageFolder(
  "clouds_test", 
  transform=test_transforms,
)
PyTorch로 배우는 Intermediate Deep Learning

정밀도 & 재현율: 이진 분류

이진 분류에서:

  • 정밀도(Precision): 올바른 양성 예측의 비율
  • 재현율(Recall): 전체 양성 예측 중 올바르게 예측된 비율

각 필드가 서로 다른 색으로 표시된 2x2 혼동 행렬과 색상 코드로 표현된 재현율 및 정밀도 수식

PyTorch로 배우는 Intermediate Deep Learning

정밀도 & 재현율: 다중 클래스 분류

다중 클래스 분류: 클래스별 정밀도와 재현율 산출

  • 정밀도(Precision): 적운으로 예측한 것 중 올바른 비율
  • 재현율(Recall): 전체 적운 예시 중 올바르게 예측된 비율

 

적운 사진

PyTorch로 배우는 Intermediate Deep Learning

다중 클래스 지표 평균화

  • 클래스가 7개이면 정밀도와 재현율 점수도 각 7개
  • 클래스별 분석 또는 집계 가능:
    • Micro 평균: 전체 데이터 기반 계산
    • Macro 평균: 클래스별 지표의 평균
    • Weighted 평균: 클래스별 지표의 가중 평균
PyTorch로 배우는 Intermediate Deep Learning

다중 클래스 지표 평균화

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")

사용 기준:

  • Micro: 불균형 데이터셋
  • Macro: 소수 클래스 성능이 중요한 경우
  • Weighted: 다수 클래스의 오류를 더 중요하게 고려하는 경우
PyTorch로 배우는 Intermediate Deep Learning

평가 루프

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()
  • 정밀도와 재현율 지표 임포트 및 정의
  • 기울기 없이 테스트 데이터 반복
  • 각 배치에서 모델 출력을 얻고, 가장 높은 확률의 클래스를 레이블과 함께 지표 함수에 전달
  • 지표 계산
print(f"Precision: {precision}")
print(f"Recall: {recall}")
Precision: 0.7284010648727417
Recall: 0.763038694858551
PyTorch로 배우는 Intermediate Deep Learning

클래스별 성능 분석

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)
  • average=None으로 지표 계산
  • 클래스별 점수 반환
  • Dataset.class_to_idx 속성으로 클래스 이름을 인덱스에 매핑
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}
PyTorch로 배우는 Intermediate Deep Learning

클래스별 성능 분석

{
  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 = 클래스 이름, 예: cirriform clouds
  • v = 클래스 인덱스, 예: 0
  • recall[v] = tensor(0.6364, dtype=torch.float32)
  • recall[v].item() = 0.6364
PyTorch로 배우는 Intermediate Deep Learning

연습해 봅시다!

PyTorch로 배우는 Intermediate Deep Learning

Preparing Video For Download...