본문 바로가기
오류 해결

[Pytorch] RuntimeError: mat1 and mat2 shapes cannot be multiplied

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

에러 메시지 설명

  이 오류는 주로 텐서(Tensor) 간의 행렬 곱셈에서 크기 불일치가 있을 때 발생합니다.
 

발생 원인

  • 이 오류는 두 텐서를 곱할 때 발생하는데, 행렬 곱셈의 규칙에 따라 두 텐서의 내부 차원이 일치하지 않을 경우 오류가 발생합니다. 즉, 첫 번째 텐서의 마지막 차원 크기와 두 번째 텐서의 첫 번째 차원 크기가 같아야 합니다. 그렇지 않으면, 두 텐서를 곱할 수 없으며 해당 오류가 발생합니다.
    • 예를 들어, 두 텐서가 각각 (3x4) 및 (3x4) 크기일 경우, 내부 차원(4와 3)이 일치하지 않으므로 곱셈이 불가능합니다​.

 

해결 방법

  • Transpose (전치): 텐서의 차원을 전치(Transpose)하여 행렬 곱셈이 가능하도록 만들 수 있습니다. 전치는 tensor.T 또는 torch.transpose() 함수를 사용하여 쉽게 구현할 수 있습니다.
tensor_1 = torch.randn(3, 4)
tensor_2 = torch.randn(4, 3)
result = tensor_1 @ tensor_2  # 올바른 곱셈

 

  • Reshape (차원 변경): 텐서의 모양을 변경하여 차원이 일치하도록 만들 수 있습니다. 예를 들어, reshape() 또는 view()를 사용하여 텐서의 차원을 변경할 수 있습니다. 단, 이 방법은 요소의 개수가 동일해야 적용 가능합니다.
tensor_1 = torch.randn(3, 4)
tensor_2 = torch.randn(12).reshape(4, 3)
result = tensor_1 @ tensor_2  # 올바른 곱셈

 

  • 입력 데이터 확인: 모델의 첫 번째 레이어에 전달되는 입력 데이터가 올바른 크기를 가지고 있는지 확인해야 합니다. 신경망을 구축할 때, 입력 차원을 맞추는 것이 중요합니다. 만약 입력이 일치하지 않는다면 nn.Flatten()이나 nn.Linear()와 같은 레이어를 사용해 입력의 크기를 변경할 수 있습니다.

 

관련 내용 및 추가 팁

  • 이 오류는 주로 신경망에서 자주 발생하며, 특히 Fully Connected Layer (nn.Linear) 또는 Convolutional Layer (nn.Conv2d)에서 입력과 출력 크기가 맞지 않는 경우 발생합니다. 또한, 이 오류는 학습 중에 발생할 수 있을 뿐만 아니라, 예측을 할 때 배치 크기를 다르게 설정했을 경우에도 발생할 수 있습니다. 이러한 오류는 텐서 간 크기 문제로 발생하기 때문에, 모델을 설계할 때 각 계층의 출력 크기와 다음 계층의 입력 크기를 주의 깊게 확인해야 합니다.
  • 텐서를 곱하기 전에 각 텐서의 차원을 항상 확인하세요.
  • print(tensor.shape)을 사용하여 각 텐서의 차원을 출력하여 미리 오류를 방지하세요.
  • 신경망을 설계할 때 각 레이어의 입출력 크기가 일관된지 확인하세요.
반응형