PyTorch의TENSOR 와 NumPy의 Array

Youngho LEE·2025년 6월 15일

텐서(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 사용 여부를 설정한다.

텐서 속성

  • 형태(shape), 자료형(dtype), 장치(device)

형태와 자료형은 넘파이 배열에서 사용하는 형태와 유사하다.
형태 : 텐서의 차원을 의미.
자료형 : 텐서에 할당된 데이터 형식을 의미.
장치 : 텐서의 GPU 가속 여부 (넘파이 배열에서는 사용하지 않는 속성임)

장치 변환

  • CPU 장치를 사용하는 Tensor와 GPU 장치를 사용하는 Tensor는 상호 간 연산이 불가능하다.
  • CPU 장치를 사용하는 Tensor와 Numpy Array간 연산은 가능
  • GPU 장치를 사용하는 Tensor와 Numpy Array간 연산은 불가능

상호 변환

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

profile
개발자

0개의 댓글