개발자의시작

[Pytorch] 04-2 Loading Data 본문

머신러닝(machine learning)

[Pytorch] 04-2 Loading Data

LNLP 2021. 11. 30. 12:50

이 글은 모두를위한딥러닝 시즌2 https://github.com/deeplearningzerotoall/PyTorch 을 정리한 글입니다.

 

GitHub - deeplearningzerotoall/PyTorch: Deep Learning Zero to All - Pytorch

Deep Learning Zero to All - Pytorch. Contribute to deeplearningzerotoall/PyTorch development by creating an account on GitHub.

github.com

 

Data in the Real World

- 복잡한 머신러닝 모델을 학습하려면 엄청난 양의 데이터가 필요하다.

- 대부분 데이터셋은 적어도 수십만 개의 데이터를 제공한다.

 

Data in the Real World : Problem

- 엄청난 양의 데이터를 한 번에 학습시킬 수 없다. 

  └ 너무 느리다.

  └ 하드웨어의 한계로 불가능하다.

- 그렇다면 일부분의 데이터로만 학습하면 어떨까?

 

Mini-batch

이렇게 해서 나온 아이디어가 미니배치이다. 전체 데이터를 미니배치라는 작은 데이터로 균일하게 나눠서 미니배치 하나하나씩 학습하는 방법이다. 이렇게 하면 컴퓨터가 데이터 셋을 모든 데이터의 cost를 계산한 뒤 gradient descent를 하지 않고, 각 미니배치의 cost에 대해서만 gradient descent를 계산하기 때문에 무리가 덜 간다.

 

 

PyTorch Dataset

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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()
 
 

- torch.utils.data.Dataset 상속

- __len__() : 이 데이터셋의 총 데이터 수

- __getitem__() : 어떠한 인덱스 idx를 받았을 때, 그에 상응하는 입출력 데이터를 반환

 

PyTorch DataLoader

1
2
3
4
5
6
7
from torch.utils.data import DataLoader
 
dataloader = DataLoader(
    dataset,
    batch_size=2,
    shuffle=True
)
 
 

- torch.utils.data.DataLoader 사용

- batch_size: 각 미니배치의 크기

  └ 통상적으로 2의 제곱수로 설정한다.( 16, 32, 64...)

- shuffle=True : Epoch 마다 데이터셋을 섞어서 데이터가 학습되는 순서를 바꾼다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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()
    
        # 100번마다 로그 출력
        print('Epoch {:4d}/{} Batch: {}/{} Cost: {:.6f}'.format(
            epoch, nb_epochs, batch_idx+1len(dataloader), cost.item()
   ))
 

- enumerate(dataloader) : minibatch 인덱스와 데이터를 받음.

- len(dataloader) : 미니배치 개수

Comments