- 배치 경사 하강법은 학습에서 전체 데이터를 사용하므로 학습 과정이 매우 안정적이지만, 계산량이 많이 든다
- 미니배치 경사 하강법은 학습에서 전체 데이터의 일부만을 보고 수행하므로 훈련 과정에서 시간이 오래 걸릴 수도 있지만 훈련 속도가 빠르다.
위 사진을 보면 Batch size, Iteration, Epoch의 대한 개념이 이해가 가능할 것이다.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
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)
위 데이터를 TensorData의 입력으로 사용하고 dataset으로 저장한다.
# batch_size는 주로 2의 배수를 사용
# shuffle=True로 하여 Epoch마다 데이터셋을 섞어서 데이터가 학습되는 순서를 바꿈
dataloader = DataLoader(dataset, batch_size=2, shuffle=True)
Dataloader는 기본적으로 2개의 인자를 받는데, dataset과 batch size이다.
model = nn.Linear(3,1)
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):
print(batch_idx)
print(samples)
x_train, y_train = samples
# H(x)계산
prediction = model(x_train)
# cost계산
cost = F.mse_loss(prediction, y_train)
#최적화
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: 0.361032
Epoch 0/20 Batch 2/3 Cost: 2.743644
Epoch 0/20 Batch 3/3 Cost: 3.741736
Epoch 1/20 Batch 1/3 Cost: 2.372217
Epoch 1/20 Batch 2/3 Cost: 2.237405
Epoch 1/20 Batch 3/3 Cost: 2.541936
Epoch 2/20 Batch 1/3 Cost: 2.544573
Epoch 2/20 Batch 2/3 Cost: 1.949817
Epoch 2/20 Batch 3/3 Cost: 1.238886
Epoch 3/20 Batch 1/3 Cost: 0.718011
Epoch 3/20 Batch 2/3 Cost: 4.471323
Epoch 3/20 Batch 3/3 Cost: 2.497370
Epoch 4/20 Batch 1/3 Cost: 2.311863
Epoch 4/20 Batch 2/3 Cost: 2.219517
Epoch 4/20 Batch 3/3 Cost: 0.412260
Epoch 5/20 Batch 1/3 Cost: 2.185984
Epoch 5/20 Batch 2/3 Cost: 2.298446
Epoch 5/20 Batch 3/3 Cost: 0.452585
Epoch 6/20 Batch 1/3 Cost: 1.856593
Epoch 6/20 Batch 2/3 Cost: 2.189931
Epoch 6/20 Batch 3/3 Cost: 1.691436
Epoch 7/20 Batch 1/3 Cost: 0.619386
Epoch 7/20 Batch 2/3 Cost: 2.804294
Epoch 7/20 Batch 3/3 Cost: 3.499679
Epoch 8/20 Batch 1/3 Cost: 2.049774
Epoch 8/20 Batch 2/3 Cost: 2.248272
Epoch 8/20 Batch 3/3 Cost: 1.071959
Epoch 9/20 Batch 1/3 Cost: 0.578942
Epoch 9/20 Batch 2/3 Cost: 4.566124
Epoch 9/20 Batch 3/3 Cost: 2.408615
Epoch 10/20 Batch 1/3 Cost: 2.372047
Epoch 10/20 Batch 2/3 Cost: 1.529424
Epoch 10/20 Batch 3/3 Cost: 1.798290
Epoch 11/20 Batch 1/3 Cost: 0.244626
Epoch 11/20 Batch 2/3 Cost: 2.760576
Epoch 11/20 Batch 3/3 Cost: 3.837979
Epoch 12/20 Batch 1/3 Cost: 2.004342
Epoch 12/20 Batch 2/3 Cost: 1.784926
Epoch 12/20 Batch 3/3 Cost: 3.575732
Epoch 13/20 Batch 1/3 Cost: 1.604547
Epoch 13/20 Batch 2/3 Cost: 2.562331
Epoch 13/20 Batch 3/3 Cost: 3.401046
Epoch 14/20 Batch 1/3 Cost: 2.044121
Epoch 14/20 Batch 2/3 Cost: 2.221576
Epoch 14/20 Batch 3/3 Cost: 1.071896
Epoch 15/20 Batch 1/3 Cost: 3.279944
Epoch 15/20 Batch 2/3 Cost: 3.039932
Epoch 15/20 Batch 3/3 Cost: 0.193200
Epoch 16/20 Batch 1/3 Cost: 2.378086
Epoch 16/20 Batch 2/3 Cost: 1.662553
Epoch 16/20 Batch 3/3 Cost: 1.726744
Epoch 17/20 Batch 1/3 Cost: 4.079601
Epoch 17/20 Batch 2/3 Cost: 1.917548
Epoch 17/20 Batch 3/3 Cost: 0.983619
Epoch 18/20 Batch 1/3 Cost: 2.603672
Epoch 18/20 Batch 2/3 Cost: 0.592571
Epoch 18/20 Batch 3/3 Cost: 4.586457
Epoch 19/20 Batch 1/3 Cost: 2.177874
Epoch 19/20 Batch 2/3 Cost: 1.850356
Epoch 19/20 Batch 3/3 Cost: 0.790117
Epoch 20/20 Batch 1/3 Cost: 1.886757
Epoch 20/20 Batch 2/3 Cost: 1.932452
Epoch 20/20 Batch 3/3 Cost: 1.717333
훈련 결과를 보면 Cost의 값이 점점 작아짐을 알 수 있다.
print(list(model.parameters()))
[Parameter containing:
tensor([[0.7885, 0.7621, 0.4585]], requires_grad=True), Parameter containing:
tensor([0.0153], requires_grad=True)]
학습이 된 모델의 파라미터를 한 번 출력하여 확인해보았다.
new_value = torch.FloatTensor([[73,80,75]])
pred_y = model(new_value)
print(pred_y)
tensor([[152.9346]], grad_fn=<AddmmBackward0>)
임의의 데이터를 입력하여 예측값을 확인해보았다.