3 minute read

Deep_Learning study Lec04-2 (Pytorch)

Boostcourse의 ‘파이토치로 시작하는 딥러닝 기초’를 통한 공부와 정리 Post

‘파이토치로 시작하는 딥러닝 기초’와 ‘텐서플로우로 시작하는 딥러닝 기초’를 함께 공부하며 개념적인 부분에서 상호보완하고 있기 때문에 다른 포스트에서 같은 내용을 다루는 부분이 있을 수 있습니다.

Goal of Study

  • 미니배치 경사하강법(Minibatch Gradient descent)를 배우고 Dataset & DataLoader 사용법에 대해 알아본다.

Keyword

  • 다항 선형 회귀(Multivariable Linear regression)
  • 미니배치 경사하강법(Minibatch Gradient descent)
  • Dataset, DataLoader

1. 강의 요약

Minibatch Gradient Descent

=> 너무 많은 데이터 양을 다룰 수 없을 때, 일부분의 데이터만 학습하기 위해 나온 아이디어.

전체 데이터를 Minibatch라는 작은 양으로 균일하게 나누어서 Minibatch 하나하나씩 학습하는 방법이다.

이려면, 모든 dataset의 cost를 다 계산한 후에 Gradient Descent를 하지 않고,
각 Minibatch에 있는 데이터의 cost만 계산한 후에 Gradient Descent를 하기 때문에, 컴퓨터에 무리가 덜 가게 된다.

이로 인해, 한 번의 Gradient Descent를 할 때, 모든 데이터를 사용하지 않으므로,
계산할 cost의 양은 줄고, 업데이트 주기는 빨라진다.

하지만 Cost를 계산할 때, 전체 데이터를 쓰지 않게 되므로 모델의 학습 방향이 잘못될 가능성이 있다.

그래서 Gradient Descent에서 기존처럼 cost가 매끄럽게 줄지 않고, 다소 거칠게 줄어든다.

2. Pytorch Dataset, DataLoader

Dataset

Pytorch에서 제공하는 모듈로, 이 모듈을 상속해 CustomDataset class를 만들면서 원하는 dataset을 지정할 수 있다.

다음과 같은 Method를 사용하여 아래와 같은 class를 작성할 수 있다.

from torch.utils.data import Dataset
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):
        x = torch.FloatTensor(self.x_data[idx])
        y = torch.FloatTensor(self.y_data[idx])
        
        return x, y

dataset = CustomDataset()

DataLoader

Pytorch에서 제공하는 DataLoader를 사용할 수 있다.

DataLoader의 Instance를 만들기 위해 dataset과 minibatch의 크기를 지정해줘야 한다.

통상적으로, Minibatch의 크기는 2의 제곱수로 지정한다.

또한, shuffle 이라는 옵션을 사용해 데이터가 학습되는 순서를 바꿔주며,
dataset의 순서를 외우지 못하게 방지할 수 있다.

from torch.utils.data import DataLoader

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

Full code

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

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):
        x = torch.FloatTensor(self.x_data[idx])
        y = torch.FloatTensor(self.y_data[idx])
        
        return x, y

dataset = CustomDataset()

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):
        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()
        ))

Result

Epoch    0/20 Batch 1/3 Cost: 0.732052
Epoch    0/20 Batch 2/3 Cost: 2.413777
Epoch    0/20 Batch 3/3 Cost: 3.588092
Epoch    1/20 Batch 1/3 Cost: 0.874734
Epoch    1/20 Batch 2/3 Cost: 3.111556
Epoch    1/20 Batch 3/3 Cost: 2.047280
Epoch    2/20 Batch 1/3 Cost: 2.450706
Epoch    2/20 Batch 2/3 Cost: 2.868001
Epoch    2/20 Batch 3/3 Cost: 0.159727
Epoch    3/20 Batch 1/3 Cost: 2.032979
Epoch    3/20 Batch 2/3 Cost: 1.402026
Epoch    3/20 Batch 3/3 Cost: 2.545635
Epoch    4/20 Batch 1/3 Cost: 3.490154
Epoch    4/20 Batch 2/3 Cost: 1.046865
Epoch    4/20 Batch 3/3 Cost: 2.180282
Epoch    5/20 Batch 1/3 Cost: 3.965909
Epoch    5/20 Batch 2/3 Cost: 0.628944
Epoch    5/20 Batch 3/3 Cost: 0.091242
Epoch    6/20 Batch 1/3 Cost: 2.185072
Epoch    6/20 Batch 2/3 Cost: 3.001906
Epoch    6/20 Batch 3/3 Cost: 0.133151
Epoch    7/20 Batch 1/3 Cost: 0.678554
Epoch    7/20 Batch 2/3 Cost: 2.514621
Epoch    7/20 Batch 3/3 Cost: 3.524901
Epoch    8/20 Batch 1/3 Cost: 1.190145
Epoch    8/20 Batch 2/3 Cost: 4.261433
Epoch    8/20 Batch 3/3 Cost: 0.029264
Epoch    9/20 Batch 1/3 Cost: 1.655056
Epoch    9/20 Batch 2/3 Cost: 1.544609
Epoch    9/20 Batch 3/3 Cost: 2.669865
Epoch   10/20 Batch 1/3 Cost: 0.537179
Epoch   10/20 Batch 2/3 Cost: 0.724912
Epoch   10/20 Batch 3/3 Cost: 6.731339
Epoch   11/20 Batch 1/3 Cost: 0.884264
Epoch   11/20 Batch 2/3 Cost: 2.826373
Epoch   11/20 Batch 3/3 Cost: 1.897639
Epoch   12/20 Batch 1/3 Cost: 2.583099
Epoch   12/20 Batch 2/3 Cost: 2.800532
Epoch   12/20 Batch 3/3 Cost: 0.171069
Epoch   13/20 Batch 1/3 Cost: 2.033923
Epoch   13/20 Batch 2/3 Cost: 3.082939
Epoch   13/20 Batch 3/3 Cost: 0.117619
Epoch   14/20 Batch 1/3 Cost: 2.639746
Epoch   14/20 Batch 2/3 Cost: 1.537610
Epoch   14/20 Batch 3/3 Cost: 0.081628
Epoch   15/20 Batch 1/3 Cost: 1.130905
Epoch   15/20 Batch 2/3 Cost: 2.687157
Epoch   15/20 Batch 3/3 Cost: 2.283725
Epoch   16/20 Batch 1/3 Cost: 2.814866
Epoch   16/20 Batch 2/3 Cost: 0.016639
Epoch   16/20 Batch 3/3 Cost: 2.645437
Epoch   17/20 Batch 1/3 Cost: 0.790315
Epoch   17/20 Batch 2/3 Cost: 3.587462
Epoch   17/20 Batch 3/3 Cost: 0.004229
Epoch   18/20 Batch 1/3 Cost: 1.900880
Epoch   18/20 Batch 2/3 Cost: 3.160680
Epoch   18/20 Batch 3/3 Cost: 0.104328
Epoch   19/20 Batch 1/3 Cost: 1.107103
Epoch   19/20 Batch 2/3 Cost: 3.064836
Epoch   19/20 Batch 3/3 Cost: 0.000705
Epoch   20/20 Batch 1/3 Cost: 2.129441
Epoch   20/20 Batch 2/3 Cost: 3.133508
Epoch   20/20 Batch 3/3 Cost: 0.098335

Leave a comment