본문 바로가기

그 땐 AI했지/그 땐 DeepLearning했지

[TAVE/PyTorch] ch03 선형 회귀 | 06 미니 배치와 데이터 로드

728x90

참고자료: https://wikidocs.net/book/2788

데이터를 로드하는 방법과 미니 배치 경사 하강법에 대해서 학습해보자!

1.  미니 배치와 배치 크기


지금까지 다뤘던 데이터는 현업에 비해 매우 적은 양이다.
만약 현업에서 수십만개 이상의 전체 데이터에 대해 경사 하강법을 수행하면 매우 느리며 계산량이 어마어마하다. 
이 때 미니 배치를 사용해보자!

📌니 배치: 전체 데이터를 더 작은 단위로 나누어 해당 단위로 학습한다.

📌배치 크기: 미니 배치의 크기, 크기를 얼만큼으로 설정하는지에 따라 미니 배치 개수가 결정된다. 배치 크기는 보통 2의 제곱수를 사용한다.

👉🏻미니 배치 학습을 하면 미니 배치만큼만 가져가서 미니 배치에 대한 비용을 계산하고 경사 하강법을 수행한다. 마지막 미니 배치까지 이를 반복한다. 이렇게 전체 데이터에 대한 학습이 1회 끝나면 1 에포크(Epoch)가 끝난다.

👉🏻미니 배치 경사 하강법은 전체 데이터의 일부만을 보고 수행하므로 최적값을 수렴하는 과정에서 값이 조금 헤매기도 하지만 속도가 빠르다는 장점이 있다.

  • 배치 경사 하강법: 전체 데이터에 대해서 한 번에 경사 하강법을 수행하는 방법
  • 미니 배치 경사 하강법: 미니 배치 단위로 경사 하강법을 수행하는 방법

 

2.  이터레이션


📌한 번의 에포크 내에서 이루어지는 매개변수인 가중치 W와 b의 업데이트 횟수이다.

👉🏻전체 데이터가 2,000일 때 배치 크기를 200으로 한다면 이터레이션의 개수는 총 10개이다. 이는 한 번의 에포크 당 매개 변수 업데이트가 10번 이루어짐을 의미한다.

 

3.  데이터 로드하기


 

미니 배치 학습을 할 수 있도록 도와주는 파이토치의 도구들을 알아보자!
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 # 데이터로더

👉🏻데이터셋과 데이터 로더를 사용하면 미니 배치 학습을 간단히 수행할 수 있다.

x_train  =  torch.FloatTensor([[73,  80,  75], 
                               [93,  88,  93], 
                               [89,  91,  90], 
                               [96,  98,  100],   
                               [73,  66,  70]])  
y_train  =  torch.FloatTensor([[152],  [185],  [180],  [196],  [142]])

dataset = TensorDataset(x_train, y_train)

👉🏻TensorDataset은 텐서를 입력으로 받는다.

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

👉🏻DataLoader는 데이터셋과 미니 배치의 크기, 기본적으로 이 2개의 인자를 입력받는다. 추가적으로 shullfe이라는 인자도 받는데 True로 선택하면 Epoch마다 데이터셋을 섞어서 데이터가 학습되는 순서를 바꾼다.

model = nn.Linear(3,1)
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5) 

nb_epochs = 20
for epoch in range(nb_epochs + 1):
  for batch_idx, samples in enumerate(dataloader):
    # print(batch_idx)
    # print(samples)
    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()
        ))
        
#Epoch    0/20 Batch 1/3 Cost: 26085.919922
#Epoch    0/20 Batch 2/3 Cost: 3660.022949
#Epoch    0/20 Batch 3/3 Cost: 2922.390869
#... 중략 ...
#Epoch   20/20 Batch 1/3 Cost: 6.315856
#Epoch   20/20 Batch 2/3 Cost: 13.519956
#Epoch   20/20 Batch 3/3 Cost: 4.262849

👉🏻이제 모델과 옵티마이저를 설계하고 훈련을 진행한다. cost값이 점차 작아지고 있다.

# 임의의 입력 [73, 80, 75]를 선언
new_var =  torch.FloatTensor([[73, 80, 75]]) 
# 입력한 값 [73, 80, 75]에 대해서 예측값 y를 리턴받아서 pred_y에 저장
pred_y = model(new_var) 
print("훈련 후 입력이 73, 80, 75일 때의 예측값 :", pred_y)

#훈련 후 입력이 73, 80, 75일 때의 예측값 : tensor([[154.3850]], grad_fn=<AddmmBackward>)

👉🏻임의의 값을 넣어 예측값을 내보았다!

 

 

728x90