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