Tensor

PyTorch 의 기본적인 자료구조 Tensor에 대해 살펴보고, 조작하는 방법을 안내합니다.

  • 담당자: 권지현 님

  • 최종수정일: 21-09-29

  • 본 자료는 가짜연구소 3기 Pytorch guide 크루 활동으로 작성됨


1. Tensor Allocation

데이터 자료구조를 차원에 따라 나누면 아래와 같이 분류할 수 있습니다. 물론 저 차원의 텐서, 고 차원의 행렬 등도 존재할 수 있습니다.

  1. 스칼라 : 차원 없음

  2. 백터() : 1차원

  3. 행렬 : 2차원

  4. 텐서 : 3차원 (이상)

그 중에서도 텐서(Tensor) 는 딥러닝의 대표적인 자료구조로 배열, 행렬 등과 유사한 형태를 가지고 있습니다. Pytorch 에서는 텐서를 활용하여 모델의 입력과 출력, 연산을 수행합니다. 본 챕터에서는 텐서를 어떻게 활용, 조작할 수 있는지에 대해 소개하겠습니다.


1.1 직접 텐서 선언

torchtensor 매서드를 사용하여 바로 텐서를 선언할 수 있습니다. 선언 방식은 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 텐서 생성

텐서를 선언하는 방법에 대해 안내하겠습니다. 텐서는 기존 데이터로부터 직접 생성하는 방법, Numpyndarray 를 사용하는 방법, 이미 선언된 텐서를 활용하는 방법 등이 있습니다.


1.2.1 직접 생성

원본 데이터로부터 직접 텐서를 생성, 선언하는 방법에 대해 알아보겠습니다.

torchtensor 매서드를 사용합니다.

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 를 텐서로 변환하겠습니다. torchfrom_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 다른 텐서에서 생성

이미 생성된 텐서를 사용할 수 있습니다. torchones_like, rand_like 매서드가 사용됩니다.

1.1.4 기타

torchones_like, rand_like 매서드를 사용하면 무작위의 수, 상수 값을 사용하는 텐서를 선언할 수 있습니다.


2. Tensor approach

텐서 조작과 연산에 대해 살펴보겠습니다.


2.1 Indexing, Slicing

2.2 Transposing

2.3 Broadcasting

2.4 In-place

3 Arithmetic Operation

3.1 Matrix Multiplication

3.2 Mean

3.3 Sum

3.4 Max

4 Tensor Manipulation

4.1 View

4.2 Squeeze

4.3 Type Casting

4.4 Concatenate

4.4 Stacking