0. PyTorch Process
파이토치에서는 위와 같은 딥러닝의 단계들을 쉽게 구현할 수 있도록 도와준다.
Data = `torch.utils.data.Dataset` , `torch.utils.data.DataLoader`
Model = `torch.nn.Module`
Loss = `torch.nn`, `torch.nn.functional`
Optimization = `torch.optim`
1. Dataset, DataLoader
Dataset과 DataLoader을 사용하면 데이터 셋에서 미니배치 크기의 데이터를 반환하게 된다. 또한 미니 배치의 크기는 `batch_size`라는 파라미터를 이용하여 설정해 줄 수 있다.
1-1. Dataset
`Dataset`은 단일 데이터를 모델의 입력으로 사용할 수 있는 형태로 변환하는 작업을 한다. 이미 PyTorch에는 흔히 사용되는 데이터셋들에 대해서는 구현이 되어있어 편리하게 사용할 수 있다.
이 외의 데이터셋은 직접 구축해야하는데 위의 `Dataset`의 클래스를 상속하여서 커스텀 데이터셋을 구현해야 하며, 반드시 아래의 3가지 필수 메서드가 있다.
from torch.utils.data import Dataset
class CustomDataset(Dataset):
def __init__(self):
# Dataset 객체가 생성될 때 한번만 실행됨.
# 주로 사용할 데이터 셋을 불러오고 필요한 변수를 선언
def __getitem__(self,idx):
# 주어진 인덱스에 해당하는 단일 데이를 불러옴.
# 이는 DataLoader에서 idx를 넘겨받아서 사용됨
def __len__(self):
# 데이터 셋의 데이터 개수를 반환
이러한 Custom Dataset을 구현할 때는 주의해야할 점들이 있는데
1. 데이터 타입: PyTorch는 `torch.tensor`객체를 다루기 때문에 데이터는 tensor 형태로 변환되어야 한다. 따라서 `__getitem__`에서 반환되는 데이터도 tensor 형태여야 한다.(물론 list, tuple 등도 되지만 원소가 tensor이어야 함)
2. 데이터 차원: `Dataset`은 `DataLoader`과 함께 사용된다. 이 `DataLoader`에서 데이터들을 미니배치로 묶어주는 역할을 하는데, 반환되는 모든 데이터가 차원이 같아야한다. (높이, 너비, 채널 혹은 시퀀스 길이)
1-2. DataLoader
DataLoader은 Dataset을 이용하여 데이터셋의 단일 데이터들을 정해진 개수만큼 모아서 미니배치로 구성하는 역할을 해준다. 다양한 인자를 사용하게 된다.
Dataset:사용하고자하는 데이터 셋
batch_size: 미니 배치의 크기(int, default=1)
shuffle:epoch마다 데이터의 순서 섞기 유무(bool,default=False)
num_workers:데이터 로딩에 사용되는 subprocess 개수(int,default=0)
drop_last:마지막 미니배치 데이터수가 미니 배치 크기보다 작을 경우 데이터를 버리는 유무
(bool,default=False)
2. Model
PyTorch는 이미 다양한 모델들을 쉽게 사용할 수 있도록 제공하고 있다.
Torchvision 라이브러리는 이미지 분석에 특화된 다양한 모델을 제공하며, PyTorch Hub는 CV 뿐만 아니라 audio, generative, NLP 도메인의 모델들이 공개되어 있다.
2-1. Model Load
우선 Torchvision에서는 아래와 같이 모델이름을 통해서 모델을 불러올 수 있다.
import torchvision
model=torchvision.models.resnet50()
Pytorch Hub에서는 모델마다 전달하는 인자가 다르기 떄문에 사이트에 들어가 각 모델을 불러오는 방법을 참고하면 된다.
import torch
model=torch.hub.load('pytorch/vision','resnet50')
2-2. Custom model
딥러닝은 빠르게 발전하고 있으며 논문에 공개되는 모델들은 주로 Github 등의 코드 공유 플랫폼에만 공개되기 때문에 빠르게 새로운 기술을 습득하고 사용해보기 위해서는 PyTorch를 이용하여 모델을 어떻게 정의하고 사용하는지 이해하는 것이 중요하다
class CustomModel(nn.Module):
def __init__(self):
super().__init__()
self.encoder=nn.Linear(10,2)
self.decoder=nn.Linear(2,10)
def forward(self,x):
out=self.encoder(x)
out=self.decoder(out)
return out
model=CustomModel()
우선 기본적으로 `torch.nn.Module` 클래스를 상속받아서 정의하며, 이 역시 커스텀 데이터셋처럼 주의해야할 점이 있다.
1. `super().__init__()`을 통해 부모클래스(nn.Module)을 초기화한 후 모델의 레이어와 파라미터를 초기화한다. 이를 꼭 사용해야 nn.Module의 기능도 정상적으로 사용할 수 있다.
2. forward: 입력 데이터에 대한 연산을 진행한다.
3. 역전파와 최적화
for epoch in range(num_epochs):
for data, label in train_dataloader:
# 이전 gradient를 0으로 초기화 시킴
# 초기화를 진행하지 않으면 이전 gradient가 누적되어 학습
optimizer.zero_grad()
# 데이터를 모델을 통해 연산
output=model(data)
# loss 계산
loss=loss_function(output,label)
# loss에 대한 gradient 계산
# AutoGrad를 통해 자동으로 계산
loss.backward()
# gradient를 이용해 파라미터 업데이트
optimizer.step()
`loss.backward()`를 계산할 때 사용되는 `AutoGrad`란 tensor의 연산에 대한 미분을 자동으로 계산한다. 이는 내부적으로 computational graph (이전에 역전파 과정에서 배운 노드와 엣지로 구성된 그래프)를 생성하여 계산된다. 이 `AutoGrad`가 있어서 직접 gradient를 계산하는 식을 작성하지 않아도 된다.
4. 추론과 평가
추론이란, 학습된 모델을 이용하여 입력 데이터에 대한 예측 결과를 내놓는 과정을 말하낟.
일반적으로 `model.eval()`을 이용하여 model을 평가모드로 전환하여 dropout이나, batchnorm이 학습과정과 다르게 작동하게 세팅하고, `torch.no_grad()`를 추가하여 위에서 언급했던 AutoGrad가 추론과정에서는 일어나지 않게 한다.
model.eval()
with torch.no_grad():
for data in test_dataloader:
pred=model(data)
평가의 경우는 태스크에 맞는 metric을 선정하여 numpy array로 변화하여 `Scikit-learn`이나 Pytorch를 이용하여 직접 구현하여 성능을 평가할 수 있다.
'ML & DL > 개념정리' 카테고리의 다른 글
Timm을 이용한 Finetuning 실습 (0) | 2024.01.09 |
---|---|
Pretrained Model (0) | 2024.01.09 |
PyTorch-DNN, CNN을 이용한 MNIST 실습 (0) | 2024.01.02 |
딥러닝 발전 (0) | 2023.12.28 |
Linear, Lasso, Ridge Regression (0) | 2023.12.27 |