윤제로의 제로베이스

미니 배치와 데이터 로드 (Mini Batch and Data Load) 본문

Background/Pytorch 기초

미니 배치와 데이터 로드 (Mini Batch and Data Load)

윤_제로 2022. 1. 16. 00:54

1. 미니 배치와 배치 크기 (Mini Batch and Batch Size)

  • 에포크(Epoch)전체 훈련 데이터가 학습에 한 번 사용된 주기를 말한다.
  • 전체 데이터에 대해서 한번에 경사 하강법을 수행하는 방법을 '배치 경사 하강법'이라고 부른다.
  • 미니 배치 단위로 경사 하강법을 수행하는 방법을 '미니 배치 경사 하강법'이라고 부른다.
  • 배치 경사 하강법은 경사 하강법을 할 떄, 전체 데이터를 사용하므로 가중치 값이 최적값에 수렴하는 과정이 매우 안정적이지만, 계산량이 많이 든다.
  • 미니 배치 경사 하강법은 경사 하강법을 할 때, 전체 데이터의 일부만을 보고 수행하므로, 최적값으로 수렴하는 과정에서 값이 조금 헤매기도 하지만 훈련 속도가 빠르다.

 2. 이터레이션 (Iteration)

  • 이터레이션이란 한번의 에포크 내에서 이루어지는 매개 변수인 가중치 W와 b의 업데이트 횟수이다.

3. 데이터 로드하기 (Data Load)

파이토치에서는 데이터를 쉽게 다루도록 데이터셋(Dataset)과 데이터로더(DataLoader)를 제공한다.

이를 통해 미니 배치 학습, 데이터 셔플, 병렬 처리까지 수행할 수 있다.

 

import torch
import torch.nn as nn
import torch.nn.functional as F
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)

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

nb_epochs = 20
for epoch in range(nb_epochs + 1):
  for batch_idx, samples in enumerate(dataloader):
    # print(batch_idx) # 훈련이 궁금하다면 주석 처리를 해제하고 훈련
    # print(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 {:4d}/{} Batch {}/{} Cost: {:.6f}'.format(
        epoch, nb_epochs, batch_idx+1, len(dataloader),
        cost.item()
        ))