본문 바로가기
오류 해결

[Pytorch] RuntimeError: Expected object of scalar type Float but got scalar type Long

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

에러 메시지 설명

  이 오류는 PyTorch에서 연산을 수행할 때, 텐서의 데이터 유형이 기대와 다를 때 발생합니다. 주로 모델이 부동소수점(Floating Point) 형식의 데이터를 기대하는 상황에서, 정수형(Long) 데이터를 전달할 경우 발생합니다.

 

발생 원인

  • 데이터 유형 불일치: 대부분의 PyTorch 연산, 특히 신경망 학습과 관련된 연산은 입력 데이터를 Float형으로 기대합니다. 하지만 입력 데이터나 레이블이 Long 형식으로 제공되면 이 오류가 발생할 수 있습니다.
  • 잘못된 텐서 변환: 텐서를 생성할 때나 데이터 로딩 과정에서 데이터 타입을 명시하지 않으면 기본적으로 Long 형식으로 저장될 수 있습니다. 모델이 Float 형식을 요구할 때, 이 불일치로 인해 문제가 발생합니다​.

 

해결 방법

  • 데이터 타입 변환: 데이터를 Float형으로 변환하여 문제를 해결할 수 있습니다. torch.Tensor.float() 메서드를 사용하여 데이터를 변환하세요.
inputs = inputs.float()  # 데이터를 Float 형식으로 변환

  레이블이 Long 형식으로 남아 있어도 괜찮습니다. 예를 들어, nn.CrossEntropyLoss는 레이블이 Long 타입이어야 하지만, 입력은 Float 타입이어야 합니다.

 

  • 데이터 로딩 시 타입 변환: 데이터 로딩 시 torchvision.transforms를 사용할 경우, 데이터의 타입을 명시적으로 Float로 변환하도록 설정할 수 있습니다.
transform = transforms.Compose([
    transforms.ToTensor(),
    transforms.Lambda(lambda x: x.float())  # Float으로 변환
])

 

  • 텐서 타입 일관성 확인: 오류가 발생한 연산이나 레이어에서 입력 데이터의 타입이 일관성 있게 설정되어 있는지 확인하세요. 특히, 텐서 연산에서 서로 다른 데이터 유형을 가진 텐서를 혼합하여 사용하면 이 오류가 발생할 수 있습니다.
print(tensor.dtype)  # 텐서의 데이터 타입을 확인

 

관련 내용 및 추가 팁

  • 이 오류는 주로 신경망 학습 과정에서 발생하며, 레이블과 입력 텐서의 데이터 유형이 일치하지 않거나 모델이 기대하는 형식과 맞지 않을 때 발생합니다. 예를 들어, 회귀 모델에서는 입력 데이터가 Float이어야 하고, 다중 클래스 분류 모델에서는 레이블이 Long이어야 하는 등, 각 연산에 맞는 데이터 형식이 다르므로 이를 주의해야 합니다​.
  • 데이터를 모델에 전달하기 전에 항상 입력과 레이블의 데이터 유형을 확인하세요.
  • 데이터 로딩 및 전처리 과정에서 명시적으로 타입을 변환해 줌으로써 미리 오류를 방지할 수 있습니다.
반응형