Pytorch에서는 대부분의 모델을 Class를 사용하여 구현하기 때문에 Class로 구현하는 방식을 반드시 숙지할 필요가 있다.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(1,1)
def forward(self, x):
return self.linear(x)
model = LinearRegressionModel()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=0.01)
# 전체 훈련 데이터에 대해 모델을 2000회 학습
nb_epochs = 2000
for epoch in range(nb_epochs + 1):
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(y_train, prediction)
# 최적화
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
Epoch 0/2000 Cost: 13.103541
Epoch 100/2000 Cost: 0.002791
Epoch 200/2000 Cost: 0.001724
Epoch 300/2000 Cost: 0.001066
Epoch 400/2000 Cost: 0.000658
Epoch 500/2000 Cost: 0.000407
Epoch 600/2000 Cost: 0.000251
Epoch 700/2000 Cost: 0.000155
Epoch 800/2000 Cost: 0.000096
Epoch 900/2000 Cost: 0.000059
Epoch 1000/2000 Cost: 0.000037
Epoch 1100/2000 Cost: 0.000023
Epoch 1200/2000 Cost: 0.000014
Epoch 1300/2000 Cost: 0.000009
Epoch 1400/2000 Cost: 0.000005
Epoch 1500/2000 Cost: 0.000003
Epoch 1600/2000 Cost: 0.000002
Epoch 1700/2000 Cost: 0.000001
Epoch 1800/2000 Cost: 0.000001
Epoch 1900/2000 Cost: 0.000000
Epoch 2000/2000 Cost: 0.000000
모델을 클래스로 구현한 것 이외에는 모두 같은 코드를 사용했으므로 코드가 이해가 되지 않는다면 이전 포스팅을 다시 보는 걸 추천한다.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
# 데이터
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]])
# class 선언
class MultivariateLinearRegression(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(3,1)
def forward(self, x):
return self.linear(x)
# 모델 선언
model = MultivariateLinearRegression()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=1e-5)
nb_epochs = 2000
for epoch in range(nb_epochs + 1):
# H(x)계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(y_train, prediction)
# 최적화
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch % 100 == 0:
print('Epoch {:4d}/{} Cost: {:.6f}'.format(
epoch, nb_epochs, cost.item()
))
Epoch 0/2000 Cost: 31667.597656
Epoch 100/2000 Cost: 0.225993
Epoch 200/2000 Cost: 0.223911
Epoch 300/2000 Cost: 0.221941
Epoch 400/2000 Cost: 0.220059
Epoch 500/2000 Cost: 0.218271
Epoch 600/2000 Cost: 0.216575
Epoch 700/2000 Cost: 0.214950
Epoch 800/2000 Cost: 0.213413
Epoch 900/2000 Cost: 0.211952
Epoch 1000/2000 Cost: 0.210560
Epoch 1100/2000 Cost: 0.209232
Epoch 1200/2000 Cost: 0.207967
Epoch 1300/2000 Cost: 0.206761
Epoch 1400/2000 Cost: 0.205619
Epoch 1500/2000 Cost: 0.204522
Epoch 1600/2000 Cost: 0.203484
Epoch 1700/2000 Cost: 0.202485
Epoch 1800/2000 Cost: 0.201542
Epoch 1900/2000 Cost: 0.200635
Epoch 2000/2000 Cost: 0.199769