Tensor¶
PyTorch 의 기본적인 자료구조 Tensor에 대해 살펴보고, 조작하는 방법을 안내합니다.
담당자: 권지현 님
최종수정일: 21-09-29
본 자료는 가짜연구소 3기 Pytorch guide 크루 활동으로 작성됨
1. Tensor Allocation¶
데이터 자료구조를 차원에 따라 나누면 아래와 같이 분류할 수 있습니다. 물론 저 차원의 텐서, 고 차원의 행렬 등도 존재할 수 있습니다.
스칼라 : 차원 없음
백터() : 1차원
행렬 : 2차원
텐서 : 3차원 (이상)
그 중에서도 텐서(Tensor) 는 딥러닝의 대표적인 자료구조로 배열, 행렬 등과 유사한 형태를 가지고 있습니다. Pytorch 에서는 텐서를 활용하여 모델의 입력과 출력, 연산을 수행합니다. 본 챕터에서는 텐서를 어떻게 활용, 조작할 수 있는지에 대해 소개하겠습니다.
1.1 직접 텐서 선언¶
torch
의 tensor
매서드를 사용하여 바로 텐서를 선언할 수 있습니다. 선언 방식은 ndarray
선언과 유사합니다.
0부터 1까지의 정수로 구성된 1차원 텐서를 선언하겠습니다.
tensor_int = torch.tensor([0,1,2,3,4,5,6,7,8,9]) # 정수
tensor_int
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
이때, 2차원의 텐서도 역시 비슷한 방법으로 선언할 수 있습니다. 이제 1부터 9까지의 9개의 실수로 구성된 2차원 텐서를 선언하겠습니다.
tensor_float = torch.FloatTensor([[1.,2.,3.],[4.,5.,6.],[7.,8.,9.]]) # 실수
tensor_float
tensor([[1., 2., 3.],
[4., 5., 6.],
[7., 8., 9.]])
이때 텐서는 dim
매서드로 차원을, size
(또는 shape
) 로 크기를 확인할 수 있습니다.
tensor_float.dim() # 2
2
데이터 타입에 따른 각각의 차원의 텐서들을 직접 선언하였습니다. 이하에서는 기존 데이터를 사용하여 텐서를 선언하는 방법에 대해 다루겠습니다.
1.2 크기에 따라 텐서 선언¶
텐서의 차원을 미리 결정한 후 random 하게 텐서를 구성할 수 있습니다.
shape = (2,3,)
rand_tensor = torch.rand(shape)
ones_tensor = torch.ones(shape)
zeros_tensor = torch.zeros(shape)
1.2 텐서 생성¶
텐서를 선언하는 방법에 대해 안내하겠습니다.
텐서는 기존 데이터로부터 직접 생성하는 방법, Numpy
의 ndarray
를 사용하는 방법, 이미 선언된 텐서를 활용하는 방법 등이 있습니다.
1.2.1 직접 생성¶
원본 데이터로부터 직접 텐서를 생성, 선언하는 방법에 대해 알아보겠습니다.
torch
의 tensor
매서드를 사용합니다.
import torch # torch import
원본 데이터의 예시로 0부터 9까지의 정수가 저장된 1차원 벡터를 사용하겠습니다.
data_1 = [0,1,2,3,4,5,6,7,8,9] # 원본 데이터 예시
len(data_1) # 10
10
원본 데이터 data_1
으로부터 직접 텐서 tensor_1
를 생성할 수 있습니다.
tensor_1 = torch.tensor(data) # 텐서 생성
이때 텐서는 dim
매서드로 차원을, size
(또는 shape
) 로 크기를 확인할 수 있습니다.
print('차원 수 : ',tensor_1.dim()) # 차원 1
print('크기 : ',tensor_1.size()) # 크기 10
차원 수 : 1
크기 : torch.Size([10])
차원수 1, 크기 10 인 텐서 tensor_1
이 생성되었음을 확인할 수 있습니다.
만약 원본 데이터가 고차원의 구조를 가지고 있는 경우도 이와 유사하게 텐서로 정의할 수 있습니다. 2차원의 차원을 가진 원본 데이터 data_2
을 예시로 살펴보겠습니다.
data_2 = [[0,1,2,3,4],[5,6,7,8,9]] # 원본 데이터 예시
len(data_2)
tensor_2 = torch.tensor(data_2) # 텐서 생성
print('차원 수 : ',tensor_2.dim()) # 차원 2
print('크기 : ',tensor_2.size()) # 크기 [2, 5]
차원 수 : 2
크기 : torch.Size([2, 5])
차원수 2, 크기 [2, 5] 인 텐서 tensor_2
이 생성되었음을 확인할 수 있습니다.
1.2.2 Numpy 로 생성¶
Tensor 는 Numpy 의 배열, ndarray 와 유사합니다. 텐서는 ndarray 로부터 생성할 수도 있습니다. 우선 1차원의 ndarray 를 선언하겠습니다.
import numpy as np
ndarray = np.array([0,1,2,3,4,5,6,7,8,9])
ndarray
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
선언한 ndarray 를 텐서로 변환하겠습니다. torch
의 from_numpy
매서드가 사용됩니다.
tensor_np = torch.from_numpy(ndarray)
tensor_np
tensor([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], dtype=torch.int32)
1.2.3 다른 텐서에서 생성¶
이미 생성된 텐서를 사용할 수 있습니다. torch
의 ones_like
, rand_like
매서드가 사용됩니다.
1.1.4 기타¶
torch
의 ones_like
, rand_like
매서드를 사용하면 무작위의 수, 상수 값을 사용하는 텐서를 선언할 수 있습니다.
2. Tensor approach¶
텐서 조작과 연산에 대해 살펴보겠습니다.