1. 미니 배치와 배치 크기
- 데이터가 너무 큰 경우 작은 단위(미니 배치)로 나누어 학습
- 여러 미니배치를 학습해 전체 데이터 학습이 1회 끝나면 1에포크(Epoch)가 끝나게 됨
- 전체 데이터에 경사하강법을 수행하면'배치 경사 하강법', 미니 배치 단위로 하면 '미니 배치 경사 하강법'이라고 부름
- 이터레이션 : 전체 데이터가 2,000 일 때 배치크기를 200으로 한다면 이터레이션은 총 10개
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)
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
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):
x_train, y_train = samples
prediction = model(x_train)
cost = F.mse_loss(prediction, y_train)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 5 == 0:
print('Epoch {:4d}/{} Batch {}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, batch_idx+1, len(dataloader),
cost.item()
))
Epoch 0/20 Batch 1/3 Cost: 2.637822
Epoch 0/20 Batch 2/3 Cost: 2.769465
Epoch 0/20 Batch 3/3 Cost: 0.987163
Epoch 5/20 Batch 1/3 Cost: 2.294036
Epoch 5/20 Batch 2/3 Cost: 2.152998
Epoch 5/20 Batch 3/3 Cost: 5.632655
Epoch 10/20 Batch 1/3 Cost: 2.742777
Epoch 10/20 Batch 2/3 Cost: 2.669617
Epoch 10/20 Batch 3/3 Cost: 0.489590
Epoch 15/20 Batch 1/3 Cost: 0.765782
Epoch 15/20 Batch 2/3 Cost: 3.040927
Epoch 15/20 Batch 3/3 Cost: 4.324440
Epoch 20/20 Batch 1/3 Cost: 1.829746
Epoch 20/20 Batch 2/3 Cost: 4.514516
Epoch 20/20 Batch 3/3 Cost: 2.241494
new_var = torch.FloatTensor([[73, 80, 75]])
pred_y = model(new_var)
print("훈련 후 입력이 73, 80, 75일 때의 예측값 :", pred_y)
훈련 후 입력이 73, 80, 75일 때의 예측값 : tensor([[151.6705]], grad_fn=<AddmmBackward0>)
2. 커스텀 데이터셋
class CustomDataset(torch.utils.data.Dataset):
def __init__(self):
데이터셋의 전처리를 해주는 부분
def __len__(self):
데이터셋의 길이. 즉, 총 샘플의 수를 적어주는 부분
def __getitem__(self, idx):
데이터셋에서 특정 1개의 샘플을 가져오는 함수
커스텀 데이터셋(Custom Dataset)으로 선형 회귀 구현
import torch
import torch.nn.functional as F
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)
model = torch.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):
x_train, y_train = samples
prediction = model(x_train)
cost = F.mse_loss(prediction, y_train)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 5 == 0:
print('Epoch {:4d}/{} Batch {}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, batch_idx+1, len(dataloader),
cost.item()
))
Epoch 0/20 Batch 1/3 Cost: 5813.212891
Epoch 0/20 Batch 2/3 Cost: 2100.857422
Epoch 0/20 Batch 3/3 Cost: 310.679901
Epoch 5/20 Batch 1/3 Cost: 3.192920
Epoch 5/20 Batch 2/3 Cost: 2.133197
Epoch 5/20 Batch 3/3 Cost: 3.113661
Epoch 10/20 Batch 1/3 Cost: 3.035672
Epoch 10/20 Batch 2/3 Cost: 2.492183
Epoch 10/20 Batch 3/3 Cost: 4.437047
Epoch 15/20 Batch 1/3 Cost: 3.557247
Epoch 15/20 Batch 2/3 Cost: 2.481020
Epoch 15/20 Batch 3/3 Cost: 2.758196
Epoch 20/20 Batch 1/3 Cost: 3.123384
Epoch 20/20 Batch 2/3 Cost: 3.331470
Epoch 20/20 Batch 3/3 Cost: 0.357248