
텐서(Tensor)란 넘파이 라이브러리의 ndarray 클래스와 유사한 구조
배열(Array)이나 행렬(Matrix)과 유사한 자료 구조(자료형)
PyTorch에서는 Tensor를 사용하여 모델의 입출력뿐만 아니라 모델의 매개변수를 부호화(Encode)하고 GPU를 활용해 연산을 가속화할 수 있다.
NumPy와 PyTorch의 공통점은 수학 계산, 선형 대수 연산을 비롯해 전치(Transposing), 인덱싱(Indexing), 슬라이싱(Slicing), 임의 샘플링(Random Sampling) 등 다양한 텐서 연산을 진행할 수 있다.
Numpy와 PyTorch의 차이점은 CPU에서 사용하는 텐서와 GPU에서 사용하는 텐서의 선언 방식에 있다. PyTorch는 GPU 가속(GPU Acceleration)을 적용할 수 있으므로, CPU Tensor와 GPU Tensor로 나눠지고, 각각의 텐서를 상호 변환하거나 GPU 사용 여부를 설정한다.
형태와 자료형은 넘파이 배열에서 사용하는 형태와 유사하다.
형태 : 텐서의 차원을 의미.
자료형 : 텐서에 할당된 데이터 형식을 의미.
장치 : 텐서의 GPU 가속 여부 (넘파이 배열에서는 사용하지 않는 속성임)
Numpy Array의 Tensor 변환
import torch
import numpy as np
ndarray = np.array([1, 2, 3], dtype=np.uint8)
print(torch.tensor(ndarray)
print(torch.Tensor(ndarray)
print(torch.from_numpy(ndarray)
결과
tensor([1, 2, 3], dtype=torch.uint8)
tensor([1., 2., 3.])
tensor([1, 2, 3] dtype=torch.uint8)
Tensor의 Numpy Array 변환
import torch
tensor = torch.cuda.FloatTensor([1, 2, 3])
ndarray = tensor.detach().cpu().numpy()
print(ndarray)
print(type(ndarray))
결과
[1. 2. 3.]
<class 'numpy.ndarray>
텐서는 기존 데이터 형식과 다르게 학습을 위한 데이터 형식으로 모든 연산을 추적해 기록한다. 이 기록을 통해 역전파(Backpropagation) 등과 같은 연산이 진행돼 모델 학습이 이뤄진다. 다시 말해 텐서의 데이터가 어떻게 변경되고 관리됐는지 기록된다.
그러므로 텐서를 넘파이 배열로 변환할 때는 detach 메서드를 적용한다. detach 메서는 현재 연산 그래프(Graph)에서 분리된 새로운 텐서를 반환한다. 새로운 텐서로 생성한 다음에 넘파이 배열로 변환한다. GPU 장치라면 CPU 장치로 변환한 다음에 넘파이 배열로 변환해야 한다.
출처
book