dj-woo.github.io

Torch_tutorials

개인 study를 위한 자료입니다.
그러다보니 내용에 잘못된 점이 있습니다.

PyTorch tutorial 을 하면서, 이해한 내용을 정리를 하였습니다.

Summary

  1. torch.tensor - “N차원 배열 data” + “GPU” + “gradient”
    • N차원 배열 data를 저장하는 면에서, numpy.ndarray와 비슷합니다.
    • CPU/GPU device 이동을 지원합니다. to(device)
    • autograd를 지원합니다. 이를 통해, back propagation을 손쉽게 할 수 있습니다.
  2. torch.nn - Neural Networks을 정의합니다.
    • Module : Layer와 forward method를 포함하며, 주로 model를 새로 정의할때, parent class 로 사용합니다.
    • Parameter : Tensor의 subclass(wrapper)로, Module에서 학습을 위한 weight 관리를 용이하게 합니다. parameters() iterator 로 불러 올 수 있습니다.
    • functional : 활성화 함수, 손실 함수 등을 포함하는 모듈로 일반적으로 F import합니다. 또한 convolution과 linear layer와 같이, 저장 state를 가지는 layer의 non-statefule 버전 레이어도 포함되어 있습니다.
  3. torch.optim - backward() 단계에서, Parameter를 update하는 optimizer를 포함하는 module
  4. Dataset - dataset을 표현하기 위해 제공되는 __len____getitem__을 포함하는 abstract class.
  5. DataLoader - Dataset을 기반으로 데이터의 배치를 출력하는 iterator.

1. torch.Tensor

numpy.ndarray와 비슷하게 다차원 연산을 위한 기본 function들을 제공합니다.

그리고, PyTorch는 tensorautograd를 넣어 가장 중심이되는 class로 사용합니다.

torch.Tensor is the central class of the package.

tensor.requires_gradTrue로 하면, tensor를 사용한 연산과정을 기록(grad_fn)합니다. 그리고, 최종단 tensor에서 .backward()가 수행되면, gradient가 계산되어 tensor.grad에 저장되고, 이 값은, grad_fn에 기록된 연산을 타고, back propagation 이 진행됩니다. 예를 들어 아래와 같이 code를 작성한 경우 [2],

아래 그림과 같은 NN이 생성이 되며, zygard_fn에, 해당 tensor가 계산 되는 과정이 저장됩니다. z.backward()가 수행이되면, z.grand_fn에서 주어진 값들이 back propagation 되면서, x.grad, a.grad, b.grad가 자동 계산됩니다. 이 기능을 통해서, tensor 만으로도 model 작성과 학습이 가능합니다. backward() exmaple

2. torch.nn & torch.optim & Dataset & DataLoader

이 부분은 실제 예제를 통해서 이해하는게 좋습니다.[3]

torch.nn, torch.optim, Dataset 그리고 DataLoader없이 Tensor만을 이용해서, 아래와 같이 Linear regression을 model을 구현하고 학습할 수 있습니다.

1) nn.functional 사용

여기서, torch.nn.functional를 사용해서, log_softmax() + negative_log_likelihood()를 하나의 함수로 처리할 수 있습니다.

2) nn.Module 사용

학습의 대상이 되는 parameter와 Neural Networks model을 쉽게 관리하기 위하여, nn.Module을 사용합니다. nn.ModuleParameters()를 이용해서, model에 속해 있는 parameter에 대해서 아래와 같이 쉽게 관리 할 수 있습니다.

3) nn.Linear 사용

미리 정의된 Model들 을 사용해서, code를 리팩토링 할 수 있습니다. nn.Linear를 사용해서, self.weightsself.bias의 정의와 초기화 작업 그리고 xb @ self.weights + self.bias 계산을 대신 할 수 있습니다.

4) optim 사용

미리 구현된, optimization 알고리즘을 torch.optim을 이용하여 사용할 수 있습니다. 이를 통해, parameters를 step() method를 사용하 update할 수 있습니다.

5) Dataset & DataLoader 사용

구현을 하다보면, data를 load하고 자르고 섞는데 많은 code가 들어 갑니다. 이때, Dataset과 DataLoader를 사용하면 이 부분을 쉽게 구현할 수 있습니다. __len____getitem__를 가진 class는 Dataset으로 사용할 수 있습니다. 반대로 __len____getitem__만 만들면, customize된 Dataset을 정의할 수 있습니다. Tensor를 입력으로 받는 경우, 미리 정의된 TensorDataset를 사용할 수 있다. DataLoader는 batch 관리를 담당합니다. DatasetDataLoader를 사용하면 아래와 같이 코드가 훨씬 깔끔해 집니다.

6) 최종 code

torch.nn & torch.optim & Dataset & DataLoader를 사용하여, 아래와 같이 code를 refactoring 할 수 있습니다.

Reference