본문 바로가기
Etc/Error

[Error] TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

by VAMOSSS 2023. 3. 16.
반응형

TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first.

cuda를 사용하여 MNIST 데이터에 대한 간단한 두 모델을 비교하기 위해 두 가지 모델의 loss 값을 matplotlib 통해 시각화하는 과정에서 다음 오류가 발생했다.

 

해당 오류는 gpu에 할당되어 있는 텐서를 numpy 배열로 변환할 때 생기는 에러라고 한다.

 

그래서 저장된 loss 값을 확인해보니 다음과 같았다.

기존 Loss 형태 (GPU에 할당되어있는 tensor)

이렇게 저장되어있는 값을 바로 matplotlib을 통해 시각화를 진행하는 과정에서 자동으로 numpy값으로 변환하려다 보니 오류가 발생한 것 같다.

 

해당 오류는 gpu에 할당된 텐서를 cpu 텐서로 변환해주면 해결된다.

위의 이미지와 같이 모든 값을 cpu 텐서로 변환해주면 numpy 값으로 변환이 잘 되는 모습을 확인할 수 있다.

 

리스트 컴프리헨션을 통해 모든 값을 cpu 텐서로 변환해주니 오류가 해결되었다.

loss 값이 이중배열(리스트)에 저장되어있어 다음과 같은 코드로 변환했다.

train_losses = [[value.cpu() for value in row] for row in train_losses]
train_accs = [[value.cpu() for value in row] for row in train_accs]
valid_losses = [[value.cpu() for value in row] for row in valid_losses]
valid_accs = [[value.cpu() for value in row] for row in valid_accs]

 

Reference

https://blog.naver.com/PostView.naver?blogId=jaeyoon_95&logNo=222109610256&categoryNo=94&parentCategoryNo=0&viewDate=&currentPage=1&postListTopCurrentPage=1&from=search

반응형

댓글