Multiclass Classification · 학습

이번에 배울 내용

클래스별 점수·확률·정답 Label의 관계를 알아야 다중 분류의 오류와 잘못된 Label을 해석할 수 있습니다.

전체 흐름

클래스 점수 → Softmax·Loss → 예측 Label → Confusion Matrix

여러 클래스의 출력

클래스 세 개라면 모델은 표본마다 점수 세 개를 냅니다. Softmax는 점수들을 함께 정규화합니다. CrossEntropyLoss에는 정규화 전 점수와 정수 Label을 사용합니다.

오답을 클래스별로 보기

정확도 하나보다 Confusion Matrix를 보면 어떤 클래스를 서로 헷갈리는지 알 수 있습니다. Label 하나가 틀렸을 때는 변경 Label 기준의 적합과 원래 의미의 정확도가 달라질 수 있습니다.

풀이 예제

제공된 중심 (-2,0),(2,0),(0,2) 주변에서 Class별 6표본, 총 18개를 만듭니다. seed=7입니다.

import numpy as np
import matplotlib.pyplot as plt
import torch
from torch import nn
rng=np.random.default_rng(7)
centers=np.array([[-2.,0.],[2.,0.],[0.,2.]])
X_np=np.concatenate([c+rng.normal(0,.25,(6,2)) for c in centers]);y_np=np.repeat(np.arange(3),6)
X=torch.tensor(X_np,dtype=torch.float32);y=torch.tensor(y_np,dtype=torch.long)
def fit_multi(labels=y):
    torch.manual_seed(7);m=nn.Linear(2,3);opt=torch.optim.SGD(m.parameters(),lr=.1);history=[]
    for _ in range(200):
        loss=nn.functional.cross_entropy(m(X),labels);opt.zero_grad();loss.backward();opt.step();history.append(loss.item())
    return m,history
model,history=fit_multi();logits=model(X).detach();prob=torch.softmax(logits,dim=1);pred=prob.argmax(dim=1)
print(prob[:3],pred[:3])
tensor([[0.9664, 0.0018, 0.0318],
        [0.9847, 0.0014, 0.0139],
        [0.9866, 0.0012, 0.0121]]) tensor([0, 0, 0])

참고 예제

추가 예제 보기

참고 자료