8주차 · Multiclass Classification과 Logits

실습 전에

01 여러 범주를 구분하기

예시 상황 사진을 고양이, 개, 새 중 하나로 분류하려고 합니다. 모델이 이 세 범주를 구분하도록 정답과 예측을 어떻게 표현하면 좋을까요?

설명
  • 각 범주에 Class ID를 부여하고, 모델은 범주별 점수를 출력하도록 구성할 수 있습니다.
  • Class ID는 식별자입니다. 번호의 크기가 범주의 순서나 거리를 뜻하지는 않습니다.

02 예측의 확신

모델이 하나의 범주를 골랐다고 해서 확실하게 구분했다고 볼 수 있을까요? 어떤 경우에 판단을 유보하고 싶을까요?

설명
  • 최대 점수의 위치는 예측 Class를 지정
  • 점수 차이와 별도의 신뢰도 평가 필요. Logit 자체는 확률이 아님

실습

1. CSV의 입력 확인

  1. 데이터를 읽는 셀을 실행하세요. x_raw와 x의 shape·dtype, 처음 다섯 행을 각각 출력하세요. 두 출력에 전처리 전·후라고 표시하세요.
  2. 같은 셀의 labels와 y에서 shape·dtype·처음 다섯 값을 출력하세요. Label을 Loss에 전달할 형태로 바꾼 부분을 찾으세요.
  3. 새 표본을 예측할 때 왜 학습 데이터의 mean·scale을 그대로 써야 하는지, 각 Feature가 모델에 입력되는 척도와 연결해 설명하세요.

2. 기준 학습 실행

  1. train_classifier를 Learning Rate η∈{0.001,0.01,0.1}\eta\in\{0.001,0.01,0.1\}, 각각 1000 epoch로 호출하세요. 함수 안의 Seed와 모델 초기화를 유지하세요.
  2. 각 호출이 반환한 마지막 Loss·Training Accuracy를 Learning Rate별 표로 적으세요. Loss와 Accuracy의 변화는 반환한 두 기록을 같은 epoch에서 대조하세요.
  3. Loss는 줄지만 Accuracy는 그대로인 구간이 있다면 한 곳을 골라 표시하세요. 정답 Class의 Probability와 최종 Class 판정의 차이로 설명하세요. 해당 구간이 없으면 없다고 적으세요.

3. 출력을 해석하기

  1. 실습용 Notebook에서 logits=model(x) 계산이 포함된 예측 결과 코드 셀을 찾으세요. 앞 활동에서 학습한 model을 그대로 사용합니다.
  2. 표본 index 0–9를 10행으로, Logit·Probability·예측 Label·정답 Label을 네 열로 기록하세요. 값은 각각 logits[:10], probability[:10], prediction[:10], labels[:10]에서 확인합니다.
  3. 제공된 assert 안의 torch.allclose 호출을 별도 셀에서 출력하고, 전체 표본의 Probability 합 검사 결과를 참/거짓으로 기록하세요. 이어서 logits.argmax(1)와 probability.argmax(1)를 원소별로 대조해 일치 여부를 기록하세요.
  4. 오분류를 최대 3개 골라 표본 index·실제 Label·예측 Label을 적으세요. 없으면 ‘없음’으로 기록하세요.

제출·저장

코드, 실제 Output·그래프, 직접 작성한 해석을 포함하세요. 제출은 KLAS를 이용하며 기한은 학기 일정과 최신 공지를 확인합니다.

파일명: 이름_학번_8주차.ipynb.

실행 환경을 다시 시작하고 전체 코드를 위에서부터 실행한 뒤 저장하세요.

선택 실습

Class 번호를 Float Tensor로 전달한 경우

  1. 모델 학습까지 마친 뒤, 노트북 맨 아래에 Code Cell을 추가하고 다음 코드를 실행하세요.
    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())
  2. 출력 아래에 Text Cell을 추가해 다음 두 가지를 적으세요.
    • 두 Target의 shape와 dtype, 오류 메시지에서 요구하는 dtype.
    • 각 샘플의 Class 번호 하나를 담은 Target에서, 같은 번호라도 Float Tensor로 전달하면 Loss를 계산할 수 없는 이유.

    y.float()는 새 Tensor를 만듭니다. 원래 y는 그대로이므로 마지막 줄에서는 정수형 Target으로 Loss를 계산합니다.