본문 바로가기

개발/python

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

Pytorch(파이토치)를 사용하다보면, TypeError: can't convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to host memory first. 와 같은 오류 문구가 발생하는 경우가 있습니다.

 

저와 같은 경우는 아래와 같이 model을 학습하여 모델의 output tensor를 이용하여 작업을 할때 이런 오류가 발생했는데요,

 

해당 오류가 발생하는 이유는 cuda device (gpu)에 할당되어있는 tensor 객체를 numpy 형태로 변경하려고 할때 발생하는 오류라고 합니다. 위의 코드 같은 경우는 model의 output인 activation에 대해서 np.concatenate() 함수를 사용해 gpu에 할당되어있는 tensor를 numpy 형태로 변경하여 처리하는 과정에서 발생하는 오류입니다. (모든 pytorch model output은 torch 객체이며, 입력데이터와 학습 모델을 gpu에 할당하여 학습하기 때문에 output또한 gpu가 할당되어있는 tensor객체입니다.)

 

이러한 문제를 해결하기 위해서 10번 라인의 주석처럼 gpu가 할당되어있는 tensor 형태의 activation에서 gpu를 제거하고 numpy로 바꾸는 작업이 필요합니다. 오류를 해결하기 위해 10번 라인에 들어갈 코드는 다음과 같습니다.

 

activation = activation.cpu().numpy()

 

tensor.cpu().numpy()를 사용하게 되면, gpu에 할당되어있는 tensor를 cpu에 할당시키고 tensor를 numpy형태로 변경합니다. 이렇게 변경된 numpy 형태에 대해 연산을 수행하면 해당 오류를 해결할 수 있습니다.

 

많은 도움이  되셨기를 바랍니다 :)