본문 바로가기
모두의 딥러닝/강의자료 정리

Lab_04-2: Loading Data(mini batch)

by cvlab_김준수 2025. 1. 15.

실제 데이터는 굉장히 크기때문에 큰 데이터를 한번에 이용해서 모델을 학습시키에는 비용이 많이 든다. 따라서 우리는 mini batch를 통해서 더 빠른 업데이트와 비용을 통해 모델을 학습시키곤 한다.

 

Mini batch란?

: 큰 데이터를 특정 크기의 batch로 나누는 것을 말한다.

 

 

Mini batch Gradient란?

: 특정 크기로 나누어진 데이터를 하나씩 사용해서 모델을 점진적으로 학습시키는 것을 말한다.

 

 

 

 

코드를 이용한 Mini batch Gradient

from torch.utils.data import Dataset

 

: 데이터셋을 구조화하고 관리하기 위한 기본적인 틀을 제공하는 클래스이다. 이 클래스를 상속받아 사용자 정의 데이터셋을 만들 수 있고, 데이터 로딩 및 전처리 과정을 간편하게 수행할 수 있게 도와준다.

 

from torch.utils.data import DataLoader

: 데이터셋을 효율적으로 로드하고 배치 단위로 처리할 수 있도록 도와주는 유틸리티 클래스이다.

 

 

import torch
import torch.optim as optim # 쉬운 Gradient 계산
import torch.nn.functional as F # loss 함수 제공 -> loss 함수 변경에 용이
import torch.nn as nn # 파라미터 관리와 모듈의 재사용성을 통해 효율적이고 유지보수가 용이
from torch.utils.data import Dataset
from torch.utils.data import DataLoader


class MultivariateLinearRegressionModel(nn.Module):
  def __init__(self):
    super().__init__()
    self.linear = nn.Linear(3, 1) # 입력 차원 3, 출력 차원 1
  def forward(self, x): # Hyepothersis 계산
    return self.linear(x)


# (1) - 1 데이터 셋 정의
class CustomDataset(Dataset):
  def __init__(self):
    self.x_data = [[73, 80, 75],
                   [93, 88, 93],
                   [89, 91, 90],
                   [96, 98, 100],
                   [73, 66, 70]]
    self.y_data = [[152], [185], [180], [196], [142]]


  def __len__(self): # 데이터셋의 총 데이터 수
    return len(self.x_data)


  def __getitem__(self, idx): # 어떤 인덱스 idx를 받았을 때, 그에 상응하는 입출력 데이터 반환
    x = torch.FloatTensor(self.x_data[idx])
    y = torch.FloatTensor(self.y_data[idx])
    return x, y

dataset = CustomDataset()

# (1) - 2 데이터셋 배치 설정
dataloader = DataLoader(
 dataset,
 batch_size=2, # 배치 설정(보통 2의 배수로 설정)
 shuffle=True, # 모델이 순서를 외우지 못하도록 데이터셋을 셔플
)


# (2) 모델 초기화 및 정의
model = MultivariateLinearRegressionModel()


# (3) optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=1e-5)


nb_epochs = 20
for epoch in range(nb_epochs + 1):
  for batch_idx, samples in enumerate(dataloader): # minibatch 인덱스와 데이터를 loop

    #(4) Hypothesis 계산
    Hypothesis = model(x_train)


    #(5) Cost 계산(MSE)
    cost = F.mse_loss(Hypothesis, y_train)


    #(6) Gradient descent
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()
    
    print('Epoch {:4d}/{} Batch {}/{} Cost: {:.6f}'.format(
    epoch, nb_epochs, batch_idx+1, len(dataloader),
    cost.item()
    ))