본문 바로가기

pytorch

셔플, 배치, 반복

확률적 경사 하강법 최적화 방식으로 신경망 모델을 훈련하려면 훈련 데이터를 무작위로 섞은 배치로 만들어 주입하는 것이 중요하다. 

데이터 로더 객체의 batch_size 매개변수를 사용하여 배치 크기를 지정하는 방법을 보았음, 배치를 만드는 것 외에도 데이터셋을 섞거나 재순환하는 방법에 대해 알아본다.

 

먼저 joint_dataset 을 사용하여 셔플링된 데이터 로더를 만든다.

import torch
from torch.utils.data import DataLoader
from torch.utils.data import Dataset

torch.manual_seed(1)

t_x = torch.rand([4, 3], dtype=torch.float32)
t_y = torch.arange(4)

class JointDataset(Dataset):
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __len__(self):
        return  len(self.x)
    
    def __getitem__(self, idx):
        return self.x[idx], self.y[idx]
    
joint_dataset = JointDataset(t_x, t_y)
data_loader = DataLoader(dataset=joint_dataset, batch_size=2, shuffle=True)

for i, batch in enumerate(data_loader, 1):
    print(f'배치 {i}:', 'x:', batch[0], '\n     y:',batch[1])
    
>>>
배치 1: x: tensor([[0.7576, 0.2793, 0.4031],
        [0.4388, 0.6387, 0.5247]])
     y: tensor([0, 3])
배치 2: x: tensor([[0.3971, 0.7544, 0.5695],
        [0.7347, 0.0293, 0.7999]])
     y: tensor([2, 1])

항목 간 대응이 깨지지 않고 행이 섞여 있는 것을 확인 가능 전체 데이터 셋을 나눈거임

 

여러 에포크 동안 모델을 훈련할 때 데이터셋을 원하는 에포크 수만큼 섞어서 반복해야 한다.

 

for epoch in range(2):
    print(f'에포크 {epoch+1}')
    for i, batch in enumerate(data_loader, 1):
        print(f'배치 {i}:', 'x:', batch[0], '\n     y:', batch[1])
        
>>>
에포크 1
배치 1: x: tensor([[0.7347, 0.0293, 0.7999],
        [0.4388, 0.6387, 0.5247]])
     y: tensor([1, 3])
배치 2: x: tensor([[0.3971, 0.7544, 0.5695],
        [0.7576, 0.2793, 0.4031]])
     y: tensor([2, 0])
에포크 2
배치 1: x: tensor([[0.4388, 0.6387, 0.5247],
        [0.3971, 0.7544, 0.5695]])
     y: tensor([3, 2])
배치 2: x: tensor([[0.7347, 0.0293, 0.7999],
        [0.7576, 0.2793, 0.4031]])
     y: tensor([1, 0])

각 반복마다 다른 원소의 사용