본문 바로가기
오류 해결

[Pytorch] IndexError: Target X is out of bounds

by First Adventure 2024. 9. 21.
반응형

에러 메시지 설명

  이 오류는 PyTorch에서 주로 다중 클래스 분류를 다룰 때 발생합니다. 레이블 값이 모델이 예측할 수 있는 클래스 범위를 벗어날 경우 이 오류가 발생합니다. 즉, 타겟(레이블)의 값이 예상하는 클래스 인덱스 범위를 넘어서는 경우입니다.

 

발생 원인

  • 레이블 값이 클래스 범위를 초과: 다중 클래스 분류에서 모델이 예측하는 클래스 수보다 큰 값이 레이블로 지정될 경우 발생합니다. 예를 들어, 모델이 3개의 클래스를 예측하는데 레이블 값이 3 이상일 때 발생할 수 있습니다.
    • 예: nn.CrossEntropyLoss는 레이블 값이 [0, num_classes-1] 범위 내에 있어야 합니다.
  • 클래스 인덱스 오류: 모델이 예측하는 클래스의 개수가 실제로 제공된 레이블과 일치하지 않으면 발생할 수 있습니다. 예를 들어, 모델의 출력 차원이 (batch_size, num_classes)인데 레이블이 (batch_size, some_other_classes)일 경우 발생합니다​.

 

해결 방법

  • 레이블 값 확인: 레이블이 모델의 클래스 개수 내에 있는지 확인합니다. 예를 들어, 모델이 3개의 클래스를 예측하는 경우 레이블은 0, 1, 2 값만 가져야 합니다.
print(target)  # 레이블 값을 출력하여 확인

 

  • 레이블 값을 클립하거나 수정: 만약 레이블 값이 잘못되었다면, 레이블을 수정하거나 올바른 범위 내에서 클립할 수 있습니다.
target = torch.clamp(target, 0, num_classes-1)  # 타겟을 클래스 범위 내로 제한

 

  • 모델 출력 크기와 레이블 크기 일치 확인: 모델이 예측하는 클래스의 개수와 레이블 크기를 일치시키는 것이 중요합니다. 예를 들어, nn.CrossEntropyLoss는 출력의 클래스 개수와 타겟의 레이블 개수가 맞아야 합니다. 모델의 출력과 레이블의 크기가 일치하는지 확인하세요.
print(output.shape, target.shape)  # 출력 및 레이블 크기 확인

 

  • 학습 데이터 확인: 데이터 전처리 과정에서 레이블 값이 올바르게 설정되었는지 확인합니다. 데이터 로드 시 잘못된 레이블이 할당되지 않았는지 점검하세요.

 

관련 내용 및 추가 팁

  • 이 오류는 주로 분류 모델에서 자주 발생하며, 특히 nn.CrossEntropyLoss나 유사한 손실 함수에서 입력과 타겟의 클래스 수가 맞지 않거나 레이블이 범위를 벗어날 때 발생합니다. 입력 데이터와 레이블의 크기 및 범위를 항상 신경 써야 합니다​.
  • 항상 데이터셋의 레이블 값이 모델의 예측 클래스 수에 맞는지 확인하세요.
  • 모델의 출력 크기와 레이블 크기가 일치하는지 주기적으로 확인하고, 데이터 전처리 과정에서 레이블을 검사하세요.
반응형