Pytorch

EHminShoov2J·2023년 11월 17일
0
post-thumbnail

1. Pytorch


1.1 Pytorch

  • Define and Run : 그래프를 먼저 정의 하고 실행 시점에 데이터를 feed해주는 방식. >> Tensorflow
  • Define by Run : 실행을 하면서 그래프를 생성하는 방식, 디버깅에 강점이 있다. >> Pytorch
  • 중요 요소 : Numpy, AutoGrad, Function

1.2 Tensor

  • 다차원 Array를 표현하는 Pytorch의 클래스로 사실상 Numpy의 ndarray와 동일하다.
  • torch.tensor(list) 혹은 torch.from_numpy(ndarray)를 활용하여 생성할 수 있음
  • torch.ones_like(), torch.flatten()등의 함수도 numpy와 동일하게 사용 가능하며, 슬라이싱도 가능하다.
  • torch.to('cuda')를 활용하여 GPU에 올려서 사용가능. 단 이때 사용가능한 data type에 제한이 있다.

1.3 Tensor()를 다루는 다양한 함수

  • torch.view(), torch.squeeze(), torch.unsqueeze()
import torch
# 초기 텐서 생성
x = torch.tensor([[1, 2, 3], [4, 5, 6]])
# view를 사용하여 텐서의 모양 변경
y = x.view(3, 2)  # 결과: tensor([[1, 2], [3, 4], [5, 6]])
# 크기가 1인 차원을 가진 텐서 생성
z = torch.randn(1, 3, 1, 4)
# squeeze를 사용하여 크기가 1인 차원 제거
w = z.squeeze()  # 결과: tensor([[-0.1901,  0.2942, -0.9842,  1.3037],
                 #         [ 0.4764,  0.1214,  0.8612,  0.5646],
                 #         [ 0.3986, -0.2139, -0.5733, -0.5669]])
# 크기가 3인 차원을 가진 텐서 생성
a = torch.tensor([1, 2, 3])
# unsqueeze를 사용하여 인덱스 1에 차원 추가
b = a.unsqueeze(1)  # 결과: tensor([[1], [2], [3]])
  • torch.mm() : 행렬곱셈을 진행시켜준다. 단 torch.matmul 또한 행렬의 곱셈을 지원하지만, broadcasting 기능이 지원되기 때문에 명확하게 이해하고 사용하지 않으면 문제가 발생할 수 있음

1.4 torch.reshape vs torch.view()

  • view 함수의 경우 텐서 내부 데이터를 공유하여 모양을 변경하기 때문에, 새로운 텐서는원래 텐서와 데이터를 공유하게 되며, 연속적인 메모리에 할당된다.
  • reshape의 경우 내부 데이터를 복사하여 모양을 변경하며, 연속적인 메모리 공간을 보장하지 않는다.

1.5 Autograd
Autograd는 PyTorch에서 제공하는 자동 미분 기능을 담당하는 패키지이다. PyTorch는 딥러닝 모델을 학습시키기 위해 역전파 알고리즘을 사용하는데, 이때 모델의 파라미터에 대한 손실 함수의 기울기(gradient)를 계산해야 한다. Autograd는 이러한 기울기를 자동으로 계산해주는 기능을 제공하여 딥러닝 모델의 학습을 간편하게 만들어줌.

  • backward() 함수를 loss를 적용하면 하위 항목들에 모두 적용 된다.
import torch
from torch.autograd import Variable
x = Variable(torch.Tensor([2]), requires_grad=True)
y = x ** 2 + 3
loss = 10 - y
loss.backward()
print(x.grad)
# x.grad 값이 자동으로 계산되어 있다

2. Pytorch Templete


항상 하나의 주피터 노트북에서 학습하는 것은 한계가 있다.(배포의 어려움과, 실행 순서에 따른 결과가 상이해 질 수 있음) 언젠가는 OOP의 구조로 모델을 구성해야하는 시점이 온다. 이를 위해서 미리 지정된 Teamplete을 활용하여 보다 편리하게 개발을 진행할 수 있다. 프로젝트는 아래와 같은 구조를 가지게 된다.

pytorch-template/
│
├── train.py - main script to start training
├── test.py - evaluation of trained model
│
├── config.json - holds configuration for training
├── parse_config.py - class to handle config file and cli options
│
├── new_project.py - initialize new project with template files
│
├── base/ - abstract base classes
│   ├── base_data_loader.py
│   ├── base_model.py
│   └── base_trainer.py
│
├── data_loader/ - anything about data loading goes here
│   └── data_loaders.py
│
├── data/ - default directory for storing input data
│
├── model/ - models, losses, and metrics
│   ├── model.py
│   ├── metric.py
│   └── loss.py
│
├── saved/
│   ├── models/ - trained models are saved here
│   └── log/ - default logdir for tensorboard and logging output
│
├── trainer/ - trainers
│   └── trainer.py
│
├── logger/ - module for tensorboard visualization and logging
│   ├── visualization.py
│   ├── logger.py
│   └── logger_config.json
│  
└── utils/ - small utility functions
    ├── util.py
    └── ...

3. torch.nn.Module


3.1 torch.nn.Moudle 이란?
신경망 모델을 정의할 때 사용되는 기본 클래스. torch.nn.Module을 상속하는 클래스는 다양한 신경망 계층(layer) 및 다른 모듈들을 포함할 수 있다. 이를 통해 복잡한 모델을 구축할 수 있고, 각 계층의 파라미터들은 모델 내에서 자동으로 추적되어 역전파를 통한 학습이 가능해짐.

3.2 nn.Paramerter()

  • 모듈의 attributre가 될 수 있고, required_grad = True로 지정되어 학습 대상이 되는 Tensor. Tensor를 상속해서 구현한다.

3.3 foward()

  • 모델이 입력 데이터를 받아 순전파(forward pass) 연산을 수행하는 곳으로, 모델의 아키텍처를 정의하는 부분
  • 해당 함수가 baward pass를 진행시킬 수 있게금 방향을 제시해준다.

3.4 backward()

  • PyTorch에서 자동 미분을 수행하는 데 사용되는 메서드로, 주로 손실 함수를 통한 역전파(backward propagation) 단계에서 호출. 역전파는 모델의 파라미터에 대한 손실 함수의 기울기(gradient)를 계산하고, 이를 사용하여 모델의 파라미터를 업데이트하는 데 사용.
  • 해당 함수를 호출하면 계산은 되지만, Update 되지는 않는다.

3.5 optimizer.step()

  • 모델 파라미터 업데이트 할 때 사용

4. Dataset & Dataloaders


4.1 Dataset
데이터 입력 형태를 정의하는 클래스로, init(), len(), getitem() 등을 반드시 재정의 해주어야 한다.

4.2 DataLoader

  • Data의 Batch를 생성해주는 클래스로, 학습 직전에 데이터 변환을 책임진다.
  • 주요 역할 : Tensor로 변환, Batch 처리
  • iterable 형태로 돌려주기 때문에, 데이터가 크더라도 필요할 때만 불러오기 때문에 batch 사이즈만큼의 메모리 공간만을 차지하게 한다.

5. Model 재활용하기


5.1 model.save()

  • 학습 결과를 저장하기 위한 함수로, 형태와 파라미터(추천!)등을 저장할 수 있다.
  • 요즘은 대부분 .pt 파일로 저장하는 추세

5.2 model.load_state_dict()
동일한 형태의 모델의 파라미터들을 불러와서 model에 저장 가능.

6. Monitoring

훅, 데코레이터 등

0개의 댓글