/ PYTORCH

Pytorch - Mini Batch and Data Load

Mini Batch

데이터의 수가 커지게 되면 전체 데이터에 대하여 경사하강법을 수행하는것은 매우 느리고 많은 계산량을 필요로 한다. 때문에 전체 데이터를 작은 단위로 나누어서 해당 단위로 학습하는 개념을 Mini Batch라고 한다. minibatch

mini batch 학습을 하게되면 mini batch만큼 loss를 계산하고 sgd를 수행하게 된다. 그후 마지막 mini batch까지 반복하여 수행하며 전체 데이터에 대한 학습이 끝나면 1 epoch가 끝나게 된다. batch 경사하강법은 전체 데이터를 사용하므로 가중치 값이 최적값으로 수렴하는 과정이 안정적이지만 많은 계산량을 필요로 하고, mini batch 경사하강법은 최적값으로 수렴하는 과정이 덜 안정적이지만, 빠른 훈련속도를 보인다.

Data Load

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
x1 = torch.FloatTensor([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
x2 = x1 / 2
x3 = x1 * 3

x = torch.cat([x1, x2, x3], axis=1)
y = x1 + x2 + x3
dataset = TensorDataset(x, y)
dataloader = DataLoader(dataset, batch_size=3, shuffle=True)
model = nn.Linear(3,1)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)
epochs = 20000
for epoch in range(epochs+1):
    for batch_idx, samples in enumerate(dataloader):
        x_train, y_train = samples
        y_hat = model(x_train)
        
        loss = F.mse_loss(y_hat, y_train)
        
        optimizer.zero_grad()
        loss.backward
        optimizer.step()
        
        if epoch % 1000 == 0:
            print('Epoch {:4d}/{} Batch {}/{} Loss: {:.6f}'.format(epoch, epochs, batch_idx+1, len(dataloader), loss.item()))

Custom Dataset

x1 = torch.FloatTensor([[1], [2], [3], [4], [5], [6], [7], [8], [9], [10]])
x2 = x1 / 2
x3 = x1 * 3

x = torch.cat([x1, x2, x3], axis=1)
y = x1 + x2 + x3
class custom_dataset(torch.utils.data.Dataset):
    def __init__(self):                            # 데이터셋의 전처리를 해주는 부분
        self.x_data = x
        self.y_data = y
        
    def __len__(self):                             # 데이터셋의 길이. 총 샘플의 수
        return len(self.x_data)
    
    def __getitem__(self, idx):                    # 데이터셋에서 특정 1개의 샘플을 가져오는 함수
        x = torch.FloatTensor(self.x_data[idx])
        y = torch.FloatTensor(self.y_data[idx])
        return x, y
dataset = custom_dataset()
dataset.x_data.ravel()
tensor([ 1.0000,  0.5000,  3.0000,  2.0000,  1.0000,  6.0000,  3.0000,  1.5000,
         9.0000,  4.0000,  2.0000, 12.0000,  5.0000,  2.5000, 15.0000,  6.0000,
         3.0000, 18.0000,  7.0000,  3.5000, 21.0000,  8.0000,  4.0000, 24.0000,
         9.0000,  4.5000, 27.0000, 10.0000,  5.0000, 30.0000])
dataset.y_data.ravel()
tensor([ 4.5000,  9.0000, 13.5000, 18.0000, 22.5000, 27.0000, 31.5000, 36.0000,
        40.5000, 45.0000])
dataloader = torch.utils.data.DataLoader(dataset, batch_size=2, shuffle=True)