[PyTorch] Loading Data 실습 : 모두를 위한 딥러닝 시즌2
2024. 9. 5. 11:46ㆍArtificial Intelligence/모두를 위한 딥러닝 (PyTorch)
Data Loading 이론 요약
너무 많은 양의 데이터를 한 번에 학습시키면 속도가 느리고, 하드웨어에도 부담이 될 수 있다. 이러한 문제를 해결하기 위해 전체 데이터를 균일하게 나눠서 학습시키는 Minibatch Gradient Descent를 사용한다. 데이터를 나눠서 사용하기 때문에 파라미터를 업데이트할 때마다 계산할 Cost의 양은 줄어들고 업데이트 주기가 빨라진다. 그러나 전체 데이터를 사용하지 않아서 잘못된 방향으로 업데이트가 될 수 있고, 일반적인 Gradient Descent에 비해 Cost가 거칠게 줄어든다.
Data Loading 구현 코드
라이브러리 import
# Library import
import torch
from torch.utils.data import Dataset
from torch.utils.data import DataLoader
import torch.optim as optim
import torch.nn as nn
import torch.nn.functional as F
Dataset 클래스 상속 및 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]]
# Total number of data in the dataset
def __len__(self):
return len(self.x_data)
# Return data corresponding to a particular index
def __getitem__(self, idx):
x = torch.FloatTensor(self.x_data[idx])
y = torch.FloatTensor(self.y_data[idx])
return x, y
dataset = CustomDataset()
데이터 로더 정의 & Batch size 지정
dataloader = DataLoader(
dataset,
batch_size=2, # Size of the Minibatch (2^n)
shuffle=True # Shuffle the data every epoch
)
nn.Module을 상속해서 모델 생성 & Minibatch를 활용하여 Cost 계산
class MultivariateLinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(3, 1) # 3 Input, 1 Output
def forward(self, x):
return self.linear(x)
# Initialize model
model = MultivariateLinearRegressionModel()
# Optimization definition
optimizer = optim.SGD(model.parameters(), lr=1e-5)
nb_epochs = 20
for epoch in range(nb_epochs + 1):
for batch_idx, samples in enumerate(dataloader):
x_train, y_train = samples
# Calculate H(x)
prediction = model(x_train)
# Calculate Cost
cost = F.mse_loss(prediction, y_train)
# Gradient Descent
optimizer.zero_grad()
cost.backward()
optimizer.step()
print('Epoch {:4d}/{} Batch {}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, batch_idx+1, len(dataloader), cost.item()
))
실행 결과 분석
Minibatch로 학습이 진행되는 동안 Cost 값이 전체적으로는 감소했지만, 세부적으로는 업다운이 있는 것으로 보인다. 이론에서 배운 것과 동일하게 실제로도 Cost가 거칠게 감소한 것이다.
느낀 점
- 아쉽게도 내가 입력한 데이터의 크기는 매우 작은 편이라서, 학습 시간에 큰 차이를 느끼지 못했다. 다음에 큰 데이터셋을 사용할 때는 Minibatch를 사용해서 학습을 진행하고 속도를 체크해보면 좋겠다.
- batch_idx나 epoch를 반복적으로 표시하도록 코드를 작성해야, 학습 진행 상황을 확인하기 용이한 것 같다.
*참고 자료
모두를 위한 딥러닝 시즌2 - [PyTorch] Lab-04-2 Loading Data
https://youtu.be/B3VG-TeO9Lk?feature=shared