pytorch를 사용하다 보면 모듈을 통해 나온 tensor를 사용할 일이 많은데, GPU에 올라가 있는 tensor를 이용하려면 numpy 또는 list로 변환하여야 한다.
tensor를 numpy 또는 list로 변환하는 방법은 조금만 찾아보면여러 함수들이 나오긴 하지만 각 함수들을 사용하는 순서가 꽤 중요하기 때문에 자주 쓰는 방법을 기록한다.
◾ detach()
pytorch는 tensor에서 이루어진 모든 연산을 기록(graph)해 놓는데 이 연산 기록에서 역전파가 이루어지게 된다. detach() 함수는 이 연산 기록에서 역전파를 중단하고 분리한 tensor를 반환한다.
◾ cpu()
GPU 메모리에 올라가 있는 tensor를 CPU 메모리로 복사하는 함수이다. 이후에 numpy로 변환하기 위해 먼저 해 주어야 한다.
◾ numpy()
tensor를 numpy로 변환 해 주는 함수로 CPU 메모리에 올려져 있는 tensor만 해당 함수를 적용할 수 있다고 한다. 따라서 cpu() 함수를 사용한 후에 numpy() 함수를 사용해야 한다.
따라서 이 3개 함수들의 순서는 img.detach().cpu().numpy() 이렇게 사용 해야 한다.
detach()와 cpu() 중에서 detach()를 먼저 적용하는 이유는 효율성 때문엔데, cpu() 함수를 수행하고 detach()를 수행하게 되면 cpu를 만드는 edge가 생성(금방 사라짐)된다고 한다. detach()를 먼저 수행하게 되면 이 edge는 생성되지 않는데 이런 문제 때문에 detach()를 먼저 수행한 후에 cpu()를 수행하는 것이 좋다고 한다.
참고 링크 :
https://discuss.pytorch.org/t/should-it-really-be-necessary-to-do-var-detach-cpu-numpy/35489/7