본문 바로가기

Pytorch

Pytorch 기초

공식 레퍼런스 : https://pytorch.org/docs/stable/index.html

 

PyTorch documentation — PyTorch 2.0 documentation

Shortcuts

pytorch.org

torch.tensor

파이토치의 가장 기본적인 클래스로 numpy의 ndarray와 같은 행렬을 다루는 클래스이다.

tensor_a = torch.Tensor([1,2,3]) # 기본적인 생성
tensor_b = torch.Tensor(np.arange(10)) # ndarray로 생성도 가능하다
tensor_c = torch.arange(10) # 물론 torch에도 arange 함수가 있다.
tensor_d = torch.IntTensor([1,2,3]) # int 타입의 텐서를 생성하려면 Tensor앞에 타입을 적어주자
tensor_e = tensor_a.type(torch.int32 # 텐서의 타입을 변환하려면 type함수를 사용할 수 있다.

 

tensor의 형태 변환

만약 tensor의 shape을 변경시키고 싶으면 reshape이나 view 함수를 사용하면 된다.

target = torch.arange(8) # tensor([0,1,2,3,4,5,6,7])

target.reshape(2,4) # tensor([[0,1,2,3],[4,5,6,7]])
target.view(4,2) # tensor([[0, 1],[2, 3],[4, 5],[6, 7]])

# -1을 입력하면 자동으로 적절한 크기로 shape을 잡는다.
# 하지만, -1은 단 하나의 차원에만 사용 가능하다.
target.reshape(-1,4) # tensor([[0, 1],[2, 3],[4, 5],[6, 7]]) 

target # tensor([0,1,2,3,4,5,6,7])  reshape의 함수와 view 함수는 tensor 자체를 수정하는 함수가 아니란 것에 주의

단, reshape은 특정 상황에서 텐서를 copy해서 반환 할 수 있다는 점에 주의하자.

그 이유는 view는 원본은 그대로 둔 채, 데이터를 shape을 해석하는 방식을 바꾸기 때문에 일관성이 보장되는 반면, reshape은 데이터의 구조 자체를 바꾸기 때문에 copy를 받을지 view를 받을지 모른다.

즉, view는 원본의 데이터 주소를 그대로 쓰고, reshape은 받은 텐서가 원본일지 복사본일지 모른다.

되도록이면 view를 사용하여 예기치 못한 버그를 방지하자.

그 이유에 대한 자세한 내용은 아래 링크를 참고하자(연속성 제약 조건)

https://stackoverflow.com/questions/49643225/whats-the-difference-between-reshape-and-view-in-pytorch

 

What's the difference between reshape and view in pytorch?

In numpy, we use ndarray.reshape() for reshaping an array. I noticed that in pytorch, people use torch.view(...) for the same purpose, but at the same time, there is also a torch.reshape(...) exis...

stackoverflow.com

 

그 외 여러 함수들

torch.is_tensor - 텐서 오브젝트인지 확인한다.

torch.zeros/ones - 입력으로 주어진 shape으로  0/1 로 채워진 텐서를 만든다.

torch.zeros_like/ones_list  - 입력으로 주어진 list/ndarray/tensor의 shape 와 같은 shape을 갖는 0/1로 채워진 텐서를 만든다.

torch.chunk - chunks로 주어진 값으로 그룹을 나눈다. 예를들어 10개의 원소에 대해 chunk(4)를 하면 3,3,3,1개의 그룹으로 나누어진다. chunks 그룹에 골고루 분배하는 것이 아닌 ceil(len/chunks)개씩 분배한다는 점에 유의하자. 이로 인해 len = 13에 대해 chunk(6)을 하면 3,3,3,3,1의 5개의 그룹으로 나누어진다.

tensor.swapdims - 입력으로 주어진 dim1과 dim2의 차원을 바꾼다. 3차원 텐서 A에서 dim 0,2를 바꾼다고 할 때, 
A[i][j][k] = A[k][j][i]로 계산한다고 보면 쉽다.

 

tensor.scatter_ : src의 값들을 index에 따라 target 텐서로 뿌리는 함수이다. 

tensor.gather : src의 값들을 index에 따라 target 텐서로 가져오는 함수이다.

 - scatter와 gather 두 함수에 대한 자세한 내용 및 사용법은 다음 글에서 다뤄볼 예정이다.

 

torch.allclose - 두 텐서가 서로 일정 오차 이하로 같은지 확인한다.

torch.argsort - 텐서의 각 요소가 dim에 따라 몇 번째로 크거나 작은지 반환한다.

torch.topk - k개의 가장 크거나 작은 값을 반환한다.

torch.prod - aggregation의 multiply 버전(torch.sum와 비교해서 생각해보자.)

torch.nansum/nanmean - nan값을 제외하고 sum이나 mean을 한다. 

                                         단, nansum은 nan을 0으로, nanmean은 nan을 제외한다는 점에 신경쓰자.(nanmean을 nansum                                           을 이용해 계산할 경우 값이 달라질 수 있다.

torch.squeeze/unsqueeze : 1인 차원을 제거하거나 생성한다.

torch.cat : 두 텐서를 특정 차원을 기준으로 붙일 때 사용한다.

torch.stack : 두 텐서를 새로운 차원으로 붙일 때 사용한다.

torch.triu : 텐서의 위 삼각행렬을  반환한다.

torch.bucketize : 주어진 boundary를 기준으로 input 텐서의 각 값이 몇 번째 인덱스에 속하는지 반환한다. 

 

pytorch의 함수들은 필요에 따라 매우 많은 함수들이 있어서, 이 글에서 모두 다루지는 못했다.

그러니, 필요에 따라 레퍼런스 홈페이지에서 함수를 찾아 사용하는 능력을 기르자.

torch.tensor, torch.nn, torch.nn.functional은 딥러닝을 공부하며 자주 보게 될 모듈이니 한번쯤 둘러보는 것을 추천한다.

'Pytorch' 카테고리의 다른 글

pytorch 여러 loss function의 결합  (0) 2023.04.12
[pytorch] gather와 scatter  (0) 2023.03.24