CastleJo의 개발일지

PyTorch - Pytorch Basics

|

First of All

들어가기 앞서 왜 다른 Ai 프레임워크(TF, Keras, Caffe 등)가 아닌 PyTorch를 채택했는지 알아보자.
Keras는 일단 Lower-level 프레임워크를 High-level로 이용하게 해주는 포장재라 생각하고, 비슷한 Level에 있다 생각되는 Tensorflow와 비교해보자.
일단 둘 다 상당히 Lower-level로 구동되며 속도도 빠르다.
또한 Torch가 디버깅을 하기 더 편하며 큰 데이터들을 다룰 때 유리하다고 한다.
또한 코드가 Pythonic 하다는 느낌이 강하다.
마지막으로 Backpropagation 관련해서 PyTorch가 좀 더 동적으로 돌아간다고 한다.

Tensor

numPy + AutoGrad

기본적으로 numpy.ndarray와 동일한 구조를 가진다. 생성자 또한 거의 동일하며 PyTorch의 가장 핵심적인 클래스이다.
이에 자동으로 미분함수와 값을 저장해주는 AutoGrad 기능이 추가된것이다.

Documentation

프레임워크를 가장 잘 사용하려면 공식 문서를 보는것이 가장 중요할것이다.

아래에선 공식 문서를 기반으로 자주 사용하는 메소드를 정리하는 식으로 진행할것이다.

행렬의 사칙연산

행렬곱 (Matrix Multiplication)

  • torch.mm
    [n,m] x [m,p] = [n,p]를 구현한다.
  • torch.bmm
    [b,n,m] x [b,m,p] = [b,n,p]를 구현한다.
  • torch.matmul
    mm의 기능을 좀 더 편리하게 구성해놓은 어댑터의 역할이다. 대충 써도 원하는 결과가 나올 가능성이 높다는 장점이 있지만, 그만큼 내부적인 연산이 많아 직관성이 떨어지는 단점이 있다.

Norm

Indexing

  • torch.index_select
    행렬에서 원하는 값을 가져올 때 사용된다.
  • torch.Tensor.view
    행렬을 원하는 형태로 view를 만드는 방법이다. view는 contig reshape, transpose, permute 등 여러가지 함수가 있는데, 여기를 참조하자.

Expanding

  • torch.expand
    주의할 점은 확장할 dimension의 shape이 1이여야 한다.
  • torch.repeat
    확장할 dimension이 1이 아니어도 된다. 덩어리 째로 복사가 된다.

Tensor

  • torch.Tensor
    일단 Tensor는 Class이다. 가장 기본적인 형태라고 보면 된다.
  • torch.tensor
    작명법에서도 유추할 수 있듯이, tensor는 함수이다.
    Tensor를 만들어주는 팩토리 함수라고 이해하면 좋을 것 같다. 물론 Tensor로 직접 만들수도 있지만 tensor가 더 편한 기능을 제공할것이다.
  • torch.is_tensor
    말 그대로 Tensor인지 확인하고 Boolean 값을 리턴하는 함수이다.

Tensor - Creation Ops

  • torch.tensor
  • torch.as_tensor
    데이터를 Tensor 형으로 바꾼다.
  • torch.as_strided
    기존의 Tensor에 stride를 붙여 생성한다
  • torch.from_numpy
    ndarray같은 데이터타입을 변환하는데, 동일한 메모리를 공유한다.
  • torch.zeros
    인자로 준 값에 맞춰 0으로 채워진 매트릭스를 생성한다.
  • torch.zeros_like
    인자로 준 매트릭스와 동일한 크기에 0으로 채워진 매트릭스를 생성한다.
    one, zero는 동일한 개념이므로 같이 써놨다.
    torch.full은 정해진 value로 채운다.
    empty는 빈 값으로 채운다.
  • torch.arange
    차원이 1이며 인자로받은 [start-end)인 Tensor를 만든다.
    torch.range는 arange+1의 값을 갖는다.

    Tensor - Indexing, Slicing, Joining, Mutating Ops

  • torch.cat
    튜플로 받은 데이터를 지정 차원에 맞춰 붙인다.
  • torch.chunk
    Tensor를 설정한 크기로 자른다, 마지막에 남은 나머지는 더 적은 값을 가진다.
  • torch.dsplit
    3번째 디멘션을 따라 텐서를 자른다.
  • torch.dstack
    3번째 디멘션을 따라 텐서를 쌓는다.
    vstack, hstach같이 비슷한 알고리즘인데 적용 차원이 다른 함수가 있다.
  • torch.movedim, torch.moveaxis
    원소의 순서는 유지하며 차원을 바꾼다. 1차원으로 쫙 편다음에 다시 재조립한다고 생각하자.
  • torch.gather
    index값이 설정되어있는 Tensor를 받아 타겟 Tensor에서 인덱스값을 불러오는 기능이다. 대각선의 값을 추출할 때 쓰인다.
  • torch.narrow
    입력 텐서를 축소시킨(삭제된) 텐서를 반환한다. 주소를 공유한다.
  • torch.nonzero
    입력 Tensor 중 0이 아닌 부분의 인덱스를 반환한다.
  • torch.reshape
    데이터는 같지만 지정된 shape인 텐서를 반환한다. Contiguous하느냐에 따라 View를 반환할 때도 있다.
  • torch.split
    텐서단위로 chunk를 분리한다. 반환은 view로 하게된다.
  • torch.squeeze
    Tensor에서 1인 차원들을 모두 없앤다.
  • torch.unsqueeze
    Tensor에 차원을 추가한다.
  • torch.Tensor.view
    행렬을 원하는 형태로 view를 만드는 방법이다. view는 contig reshape, transpose, permute 등 여러가지 함수가 있는데, 여기를 참조하자.

Tensor - Random sampling

Tensor - Math operations - Pointwise Ops

  • Pointwise Ops
    분량이 너무 많아져서…
    절대값과 삼각함수, 각도와 비트연산 등 이런거 없나? 하는 연산들은 전부 여기 들어있다.

    Tensor - Math operations - Reduction Ops

  • torch.argmax torch.argmin
    입력 텐서 중 최대,최소 값을 반환한다.

  • torch.amax torch.amin
    입력 텐서에서 해당 차원을 기준으로 최대, 최소값의 텐서를 반환한다.
  • torch.all torch.any
    and, or 연산이라고 보면 된다.
  • torch.norm
    Norm 연산 값을 반환한다.
  • torch.mean torch.median torch.nanmedian
    이름 그대로다. nanmedian은 nan값을 무시한다.
  • torch.count_nonzero
    각 dim단위로 0의 숫자를 센다.

    Tensor - Math operations - Comparison Ops

    양이 너무 많은데 다 거기서 거기라.. 리눅스 쉘 스크립트의 문법과 비슷하다.

Tensor - Math operations - Other Operations

  • torch.atleast_1dtorch.atleast_2dtorch.atleast_3d
    입력으로 받은 0차원을 최소 n-dimension 으로 반환해준다.
  • torch.diff
    입력으로 받은 두 텐서의 각각 요소의 차이를 가진 텐서를 반환한다.
  • torch.einsum
    아인슈타인 합을 반환한다.

    Tensor - Math operations - BLAS and LAPACK Operations

  • 선형대수에 관련된 함수들로, 유용한것들이 상당히 많다.
    양이 너무 많다.. 필요할 때 가져다 써보자.