[Pytorch] 간단한 Linear Regression 모형 만들기 본문
이번 글에서는 Pytorch로 Linear regression을 진행한다. 먼저 linear regression을 위하여 필요한 라이브러리를 불러들인다.
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
#시드 설정
torch.manual_seed(1)
먼저 각각의 x_train, y_train 값을 정하고, weight initialization, hypothesis 설정, cost function, gradient descent까지 진행하여 본다.
x_train = torch.FloatTensor([[5], [8], [9]])
y_train = torch.FloatTensor([[183], [245], [346]])
# 가중치 초기화(weight initialization)
W = torch.zeros(1, requires_grad = True)
print(W)
b = torch.zeros(1, requires_grad = True)
print(b)
#가설함수 생성
hypothesis = x_train * W + b
print(hypothesis)
#비용함수 생성
print(hypothesis)
print(y_train)
print((hypothesis-y_train)**2)
cost = torch.mean((hypothesis-y_train)**2)
print(cost)
# gradient descent
optimizer = optim.SGD([W, b], lr = 0.01)
optimizer.zero_grad()
cost.backward()
optimizer.step()
print(W)
print(b)
# 새로 조정한 W와 b값으로 cost가 얼마나 감소하였는지 확인해보자.
hypothesis = x_train * W + b
print(hypothesis)
cost = torch.mean((hypothesis - y_train)**2)
print(cost)
For loop을 활용하여 Linear Regression 학습시키기
실제 데이터는 epoch 단위로 gradient descent를 하면서 W랑 b가 조정된다. 각각의 epoch는 for loop를 활용하면 용이하다.
#데이터
x_train = torch.FloatTensor([[5], [6], [7]])
y_train = torch.FloatTensor([[23], [26], [50]])
#모델 초기화
W = torch.zeros(1, requires_grad = True) # W = 0 생성
b = torch.zeros(1, requires_grad = True) # b = 0 생성
# optimizer 설정
optimizer = optim.SGD([W, b], lr = 0.0263) #learning rate는 hyperparameter로써 임의조정을 해보았다.
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
#h(x)
hypothesis = x_train * W + b
#cost
cost = torch.mean((hypothesis - y_train)**2)
#cost로 H(x) 개선하기
optimizer.zero_grad()
cost.backward()
optimizer.step()
#10번마다 로그 출력하기
if epoch % 10 == 0:
print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, W.item(), b.item(), cost.item()))
nn.Module 활용하기
Pytorch모델은 nn.Module을 불러들여 생성한다.
class LinearRegressionModel(nn.Module):
def __init__(self):
super().__init__()
self.linear = nn.Linear(1, 1)
"""
n개의 변수를 가지는 multivariate linear regression같은 경우 nn.linear(n,1)로
작성하면 된다.
"""
def forward(self, x): #모델이 입력값으로부터 어떻게 출력값을 계산할지 알려줌.
return self.linear(x)
model = LinearRegressionModel()
이렇게 생성한 클래스로 h(x)값을 출력할 수 있다.
hypothesis = model(x_train)
print(hypothesis)
아까처럼 비용함수를 직접 구하기보다 torch.nn.functional을 활용하여 mean squared error을 구하고, gradient descent까지 진행하여 본다.
#mean squrared error로 cost구하기
cost = F.mse_loss(hypothesis, y_train)
print(cost)
# gradient descent 활용하기
optimizer = optim.SGD(model.parameters(), lr = 0.01)
optimizer.zero_grad()
cost.backward()
optimizer.step()
이 과정을 하나로 합치면 아래와 같은 linear regression 코드를 구현할 수 있다.
# 데이터
x_train = torch.FloatTensor([[5], [6], [7]])
y_train = torch.FloatTensor([[23], [26], [50]])
# 모델 초기화
model = LinearRegressionModel()
# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=0.01)
nb_epochs = 1000
for epoch in range(nb_epochs + 1):
# H(x) 계산
prediction = model(x_train)
# cost 계산
cost = F.mse_loss(prediction, y_train)
# cost로 H(x) 개선
optimizer.zero_grad()
cost.backward()
optimizer.step()
# 10번마다 로그 출력
if epoch % 10 == 0:
params = list(model.parameters())
W = params[0].item(
b = params[1].item()
print('Epoch {:4d}/{} W: {:.3f}, b: {:.3f} Cost: {:.6f}'.format(
epoch, nb_epochs, W, b, cost.item()
))
출처: https://github.com/deeplearningzerotoall/PyTorch
'AI > Pytorch' 카테고리의 다른 글
[Pytorch] MNIST 데이터셋으로 간단한 CNN 구현하기 (0) | 2021.07.27 |
---|---|
[Pytorch]- MNIST 데이터셋으로 MLP구현하기(심화편) (0) | 2021.07.26 |
[Pytorch] MNIST 데이터셋으로 간단한 MLP구현하기 (0) | 2021.07.26 |
Comments