01 여러 범주를 구분하기
예시 상황 사진을 고양이, 개, 새 중 하나로 분류하려고 합니다. 모델이 이 세 범주를 구분하도록 정답과 예측을 어떻게 표현하면 좋을까요?
설명
- 각 범주에 Class ID를 부여하고, 모델은 범주별 점수를 출력하도록 구성할 수 있습니다.
- Class ID는 식별자입니다. 번호의 크기가 범주의 순서나 거리를 뜻하지는 않습니다.
예시 상황 사진을 고양이, 개, 새 중 하나로 분류하려고 합니다. 모델이 이 세 범주를 구분하도록 정답과 예측을 어떻게 표현하면 좋을까요?
모델이 하나의 범주를 골랐다고 해서 확실하게 구분했다고 볼 수 있을까요? 어떤 경우에 판단을 유보하고 싶을까요?
x_raw와 x의 shape·dtype, 처음 다섯 행을 각각 출력하세요. 두 출력에 전처리 전·후라고 표시하세요.labels와 y에서 shape·dtype·처음 다섯 값을 출력하세요. Label을 Loss에 전달할 형태로 바꾼 부분을 찾으세요.mean·scale을 그대로 써야 하는지, 각 Feature가 모델에 입력되는 척도와 연결해 설명하세요.train_classifier를 Learning Rate , 각각 1000 epoch로 호출하세요. 함수 안의 Seed와 모델 초기화를 유지하세요.logits=model(x) 계산이 포함된 예측 결과 코드 셀을 찾으세요. 앞 활동에서 학습한 model을 그대로 사용합니다.logits[:10], probability[:10], prediction[:10], labels[:10]에서 확인합니다.assert 안의 torch.allclose 호출을 별도 셀에서 출력하고, 전체 표본의 Probability 합 검사 결과를 참/거짓으로 기록하세요. 이어서 logits.argmax(1)와 probability.argmax(1)를 원소별로 대조해 일치 여부를 기록하세요.코드, 실제 Output·그래프, 직접 작성한 해석을 포함하세요. 제출은 KLAS를 이용하며 기한은 학기 일정과 최신 공지를 확인합니다.
파일명: 이름_학번_8주차.ipynb.
실행 환경을 다시 시작하고 전체 코드를 위에서부터 실행한 뒤 저장하세요.
Class 번호를 Float Tensor로 전달한 경우
with torch.no_grad():
debug_logits = model(x)
debug_target = y.float()
print("original Target:", y.shape, y.dtype)
print("Float Target:", debug_target.shape, debug_target.dtype)
try:
F.cross_entropy(debug_logits, debug_target)
except (RuntimeError, ValueError) as error:
print(type(error).__name__, str(error))
print("integer Target Loss:", F.cross_entropy(debug_logits, y).item())y.float()는 새 Tensor를 만듭니다. 원래 y는 그대로이므로 마지막 줄에서는 정수형 Target으로 Loss를 계산합니다.