본문 바로가기

[Pytorch] 간단한 Linear Regression 모형 만들기 본문

AI/Pytorch

[Pytorch] 간단한 Linear Regression 모형 만들기

점핑노루 2021. 7. 24. 16:59

이번 글에서는 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

 

GitHub - deeplearningzerotoall/PyTorch: Deep Learning Zero to All - Pytorch

Deep Learning Zero to All - Pytorch. Contribute to deeplearningzerotoall/PyTorch development by creating an account on GitHub.

github.com

 

Comments