PyTorch 선형회귀 클래스로 구현

IngCoding·2022년 6월 15일
1

머신러닝

목록 보기
11/34

1. 단순 선형회귀 클래스로 구현하기

import torch
import torch.nn as nn
import torch.nn.functional as F
# torch.nn.Module을 상속받는 파이썬 클래스
class LinearRegressionModel(nn.Module): 
    def __init__(self): #
        super().__init__()
        # 단순 선형 회귀이므로 input_dim=1, output_dim=1.
        self.linear = nn.Linear(1, 1) 

    def forward(self, x):
        return self.linear(x)
torch.manual_seed(1)
<torch._C.Generator at 0x19efbde65d0>
# 데이터
x_train = torch.FloatTensor([[1], [2], [3]])
y_train = torch.FloatTensor([[2], [4], [6]])
model = LinearRegressionModel()
# optimizer 설정. 경사 하강법 SGD를 사용하고 learning rate를 의미하는 lr은 0.01
optimizer = torch.optim.SGD(model.parameters(), lr=0.01) 
# 전체 훈련 데이터에 대해 경사 하강법을 2,000회 반복
nb_epochs = 2000
for epoch in range(nb_epochs+1):

    # H(x) 계산
    prediction = model(x_train)

    # cost 계산
    cost = F.mse_loss(prediction, y_train) # <== 파이토치에서 제공하는 평균 제곱 오차 함수

    # cost로 H(x) 개선하는 부분
    # gradient를 0으로 초기화
    optimizer.zero_grad()
    # 비용 함수를 미분하여 gradient 계산
    cost.backward() # backward 연산
    # W와 b를 업데이트
    optimizer.step()

    if epoch % 200 == 0:
    # 200번마다 로그 출력
      print('Epoch {:4d}/{} Cost: {:.6f}'.format(
          epoch, nb_epochs, cost.item()
      ))
Epoch    0/2000 Cost: 13.103541
Epoch  200/2000 Cost: 0.001724
Epoch  400/2000 Cost: 0.000658
Epoch  600/2000 Cost: 0.000251
Epoch  800/2000 Cost: 0.000096
Epoch 1000/2000 Cost: 0.000037
Epoch 1200/2000 Cost: 0.000014
Epoch 1400/2000 Cost: 0.000005
Epoch 1600/2000 Cost: 0.000002
Epoch 1800/2000 Cost: 0.000001
Epoch 2000/2000 Cost: 0.000000

2. 다중 선형회귀 클래스로 구현하기

import torch
import torch.nn as nn
import torch.nn.functional as F
torch.manual_seed(1)
<torch._C.Generator at 0x19efbde65d0>
# 데이터
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 MultivariateLinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        # 다중 선형 회귀이므로 input_dim=3, output_dim=1.
        self.linear = nn.Linear(3, 1) 

    def forward(self, x):
        return self.linear(x)
model = MultivariateLinearRegressionModel()
optimizer = torch.optim.SGD(model.parameters(), lr=1e-5)
nb_epochs = 2000
for epoch in range(nb_epochs+1):

    # H(x) 계산
    prediction = model(x_train)
    # model(x_train)은 model.forward(x_train)와 동일함.

    # cost 계산
    cost = F.mse_loss(prediction, y_train) # <== 파이토치에서 제공하는 평균 제곱 오차 함수

    # cost로 H(x) 개선하는 부분
    # gradient를 0으로 초기화
    optimizer.zero_grad()
    # 비용 함수를 미분하여 gradient 계산
    cost.backward()
    # W와 b를 업데이트
    optimizer.step()

    if epoch % 200 == 0:
    # 200번마다 로그 출력
      print('Epoch {:4d}/{} Cost: {:.6f}'.format(
          epoch, nb_epochs, cost.item()
      ))
Epoch    0/2000 Cost: 31667.599609
Epoch  200/2000 Cost: 0.223911
Epoch  400/2000 Cost: 0.220059
Epoch  600/2000 Cost: 0.216575
Epoch  800/2000 Cost: 0.213413
Epoch 1000/2000 Cost: 0.210559
Epoch 1200/2000 Cost: 0.207967
Epoch 1400/2000 Cost: 0.205618
Epoch 1600/2000 Cost: 0.203481
Epoch 1800/2000 Cost: 0.201539
Epoch 2000/2000 Cost: 0.199770
profile
Data & PM

0개의 댓글