AI/파이토치(Pytorch)

[파이토치] 미니배치와 데이터 로드 하기

Hyen4110 2021. 9. 16. 15:05
반응형

아래 파이토치 튜토리얼들과 wikidocs를 참고하여 작성한 글입니다.

https://wikidocs.net/55580

https://pytorch.org/docs/stable/data.html?highlight=dataset#torch.utils.data.Dataset

https://pytorch.org/docs/stable/data.html?highlight=dataset#torch.utils.data.DataLoader 

https://tutorials.pytorch.kr/beginner/basics/data_tutorial.html

 

Dataset과 Dataloader — PyTorch Tutorials 1.9.0+cu102 documentation

Note Click here to download the full example code 파이토치(PyTorch) 기본 익히기 || 빠른 시작 || 텐서(Tensor) || Dataset과 Dataloader || 변형(Transform) || 신경망 모델 구성하기 || Autograd || 최적화(Optimization) || 모델 저

tutorials.pytorch.kr

 

1. 파이토치의 Dataset과 Dataloader

- PyTorch에서는 데이터 샘플을 처리하는 코드를 작성할 때 더 나은 가독성과 모듈성을 주기 위해서 두 가지 요소(torch.utils.data.DataLoader 와 torch.utils.data.Dataset)를 제공하고 있습니다 :) 

 

1) Dataset :  Datset을 사용하여 사전 로드된 dataset 또는 자체 데이터를 좀 더 깔끔하게 사용할 수 있으며, Dataset의 주요 역할은 샘플과 해당 레이블을 저장하는 것입니다.

2) Dataloader: Dataset을 입력받아서, 원하는 배치사이즈 크기로 나누어서 데이터를 저장합니다. 

 

 

*미니배치 개념 짚고 넘어가기!

- 방대한 양의 데이터를 하나의 행렬로 선언하여 전체 데이터에 대해서 경사 하강법을 수행하여 학습하게되면, 속도가 매우 느릴 뿐만 아니라 많은 계산량이 필요합니다. 이 때문에 전체 데이터를 작은 단위(Mini Batch)로 나누어서 학습, 즉 '미니 배치 학습'을 하는것이 일반적입니다. 

- 미니 배치 학습을 하게되면, 미니 배치에 대한 비용(cost)만을 먼저 계산하여 경사 하강법을 수행하여 가중치(parameter)를 업데이트 합니다('미니배치 경사하강법'). 그리고 다음 미니 배치를 가져가서 또 다시 비용을 계산하고 경사 하강법을 수행합니다. 이를 마지막 미니 배치까지 이를 반복하여 전체 데이터에 대한 학습이 끝나면 하나의 에포크(Epoch)가 끝나게 됩니다.

- 전체 데이터를 사용하여 경사하강법을 할 때에는 가중치 값이 최적값에 수렴하는 과정이 안정적인 반면 계산량이 너무 많이 드는 반면, 미니 배치 경사 하강법은 데이터의 일부만을 보고 경사하강법을 수행하므로 수렴 과정에서 값이 조금 헤매기도 하지만 훈련 속도는 빠르다는 장점이 있습니다.

 

에포크(Epoch) 전체 훈련 데이터가 1회 학습에 사용된 주기
이터레이션(Iteration) - 한 번의 에포크 내에서 이루어지는 매개변수인 가중치의 업데이트 횟수
(전체 데이터 수 / 배치 크기 = 미니 배치 수)

 

2. [실습] 미니 배치와 Dataset, Dataloader 맛보기

import torch
import torch.nn as nn
import torch.nn.functional as F

 Customdataset 을 쓰기 이전에(이후에 다룰 예정), 미리 만들어져있는 TensorDataset을 사용하겠습니다!

 *TensorDataset : 텐서를 입력값으로 받아 dataset으로 변환

from torch.utils.data import TensorDataset # 텐서데이터셋
from torch.utils.data import DataLoader # 데이터로더
x_train  =  torch.FloatTensor([[73,  80,  75], 
                               [93,  88,  93], 
                               [89,  91,  90], 
                               [96,  98,  100],   
                               [73,  66,  70]])  
y_train  =  torch.FloatTensor([[152],  [185],  [180],  [196],  [142]])

dataset = TensorDataset(x_train, y_train)

 

입력값인 x_train과 dataset을 확인했을때 결과는 아래와 같습니다.  

tensor에서 dataset으로 바뀐것을 확인할 수 있습니다. 

 

dataset을 만들었다면 이제 DataLoader에 넣을 수있습니다.

DataLoaderdataset을 shuffle한 뒤, 입력한 배치사이즈 크기의 배치로 나누어 가지고 있습니다. 

dataloader = DataLoader(dataset, batch_size=2, shuffle=True)

 

전체 데이터크기가 5이고, 배치사이즈가 2이기 때문에 dataloader에는 크기가 2,2,1의 미니배치들이 들어있습니다.

개수를 찍어보면 len(dataloader)는 3인것을 확인할 수있습니다. 

 

이제 모델과 옵티마이저를 설정합니다. 

model = nn.Linear(3,1)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)

 

전체 에포크 수를 3으로 설정하고,

한 에포크 안에서 또 배치 별로 loss를 구해서 경사하강법을 시행하였습니다.

nb_epochs = 3
for epoch in range(nb_epochs + 1):
    for batch_idx, samples in enumerate(dataloader):
        print("\n- epoch : {}/{}".format(epoch,nb_epochs))
        print("- batch_idx : ", batch_idx)
        print("- samples : ",samples)
        x_train, y_train = samples
        # H(x) 계산
        prediction = model(x_train)

        # cost 계산
        cost = F.mse_loss(prediction, y_train)

        # cost로 H(x) 계산
        optimizer.zero_grad()
        cost.backward()
        optimizer.step()

        print('- Epoch {:1d}/{} Batch {}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, batch_idx+1, len(dataloader),
            cost.item()
            ))

 

로그를 살펴보면, 배치사이즈가 2,2,1인 3개의 배치로 이루어진것을 확인할 수 있습니다.

 

미니배치와 데이터로드에 대한 간단한 실습이었습니다 :)

실습 과정에서 DataSet과 DataLoader를 간단하게 살펴보았는데요,

다음으로는 DataSet을 커스터마이징해서 Custom Dataset을 만드는 방법에 대해서 살펴보겠습니다. 

 

2021.09.16 - [파이토치(Pytorch)] - [파이토치] CustomDataset, DataLoader

반응형