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
'ML&DL > PyTorch' 카테고리의 다른 글
[PyTorch] 시계열 데이터를 위한 다양한 Normalization기법 (BatchNorm1d, GroupNorm 사용법) (2) | 2020.07.28 |
---|---|
[PyTorch] 시계열 데이터를 위한 1D convolution과 1x1 convolution (9) | 2020.07.08 |
[PyTorch] torch.nn.KLDivLoss() 사용법과 예제 (1) | 2020.07.07 |
[PyTorch] Tensor 자르기/분리하기: chunk함수 (0) | 2020.06.11 |
[PyTorch] view, reshape, transpose, permute함수의 차이와 contiguous의 의미 (3) | 2020.06.11 |