본문 바로가기

ML&DL/PyTorch

[PyTorch] numpy에서 tensor로 변환: Tensor, from_numpy함수의 차이/tensor에서 numpy로 변환: numpy함수

Numpy에서 Tensor로

PyTorch에서 Numpy array를 Tensor 자료형으로 바꾸는 일은 흔하게 이루어지는 일이다. 나같은 경우 음성신호를 입력으로 받아 Tensor로 변환하여 Dataset을 만드는데 이 연산을 사용한다. PyTorch의 2가지 변환함수와 그 차이점을 설명한다.

torch.Tensor() vs torch.from_numpy()

torch.Tensor() 는 Numpy array의 사본일 뿐이다. 그래서 tensor의 값을 변경하더라도 Numpy array자체의 값이 달라지지 않는다. 하지만 torch.from_numpy()는 자동으로 input array의 dtype을 상속받고 tensor와 메모리 버퍼를 공유하기 때문에 tensor의 값이 변경되면 Numpy array값이 변경된다. 예시를 통해 알아보자.

 

1) torch.Tensor()

tensor로 변환할 때 새 메모리를 할당한다.

 

import torch
import numpy as np
a = np.array([1,2,3,4])
b = torch.Tensor(a)
print('output tensor:',b)

b[0] = -1
print('It cannot change np.array:',a)

 

결과창:

 

 

2) torch.from_numpy()

tensor로 변환할 때, 원래 메모리를 상속받는다. (=as_tensor())

 

a = np.array([1,2,3,4])
b = torch.from_numpy(a)
print('output tensor:',b)

b[0] = -1
print('It can change np.array:',a)

 

결과창:

Tensor에서 Numpy로: numpy()

반대로 Tensor를 Numpy array로 바꾸고 싶다면 numpy함수를 사용하면 된다. 사용법은 아래와 같다.

 

import torch
import numpy as np

a = torch.rand(3,3)
b = a.numpy()

Reference

https://www.youtube.com/watch?v=VKhFeh92eps

https://stackoverflow.com/questions/48482787/pytorch-memory-model-torch-from-numpy-vs-torch-tensor