[Ch03] 05. 클래스로 파이토치 모델 구현하기

SoYeong Gwon·2022년 6월 16일
0

DeepLearning Introduction

목록 보기
2/12
post-thumbnail

본 게시글은 다음 링크(https://wikidocs.net/book/2788)의 wiki docs를 참고하여 작성되었습니다.

  • 파이토치의 구현체들은 대부분 모델을 생성할때 클래스(Class)를 사용함.
  • 선형 회귀를 클래스로 구현.

1. 클래스로 모델 구현하기

단순선형회귀모델

  • 기존의 단순선형회귀모델은 다음과 같이 구현함.
# 모델을 선언 및 초기화
import torch
import torch.nn as nn

model=nn.Linear(1,1)
  • 클래스 구현은 다음과 같음.
class LinearRegressionModel(nn.Module): #torch.nn.Module을 상속받는 파이썬 클래스
    def __init__(self):
        super().__init__()
        self.linear=nn.Linear(1,1) #단순선형회귀
    
    def forward(self,x):
        return self.linear(x)
model=LinearRegressionModel()
  • super()함수를 불러 nn.Module 클래스의 속성을 상속받아 초기화
    • 파이썬에서 객체가 갖는 속성값을 초기화
    • 객체가 생성될때 자동으로 호출됨.
  • forward()함수는 모델이 학습데이터를 입력받아서 forward 연산을 진행
    • model객체를 데이터와 함께 호출하면 자동으로 실행됨.
    • H(x)H(x) 식에 입력 xx로부터 예측된 yy를 얻는 것을 forward 연산이라고함.

다중선형회귀모델

  • 기존의 다중선형회귀모델은 다음과 같이 구현.
import torch
import torch.nn as nn

model=nn.Linear(3,1)
  • 클래스로 구현하면 다음과 같음.
class MultivariateLinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear=nn.Linear(3,1)
    
    def forward(self,x):
        return self.linear(x)
model=MultivariateLinearRegressionModel()

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

  • 모델을 클래스로 구현
import torch
import torch.nn as nn
import torch.nn.functional as F

torch.manual_seed(1)
x_train=torch.FloatTensor([[1],[2],[3]])
y_train=torch.FloatTensor([[2],[4],[6]])
class LinearRegressionModel(nn.Module): #torch.nn.Module을 상속받는 파이썬 클래스
    def __init__(self):
        super().__init__()
        self.linear=nn.Linear(1,1) #단순선형회귀
    
    def forward(self,x):
        return self.linear(x)
model=LinearRegressionModel()
optimizer=torch.optim.SGD(model.parameters(),lr=0.01)
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) 개선 및 update
    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 1800/2000, Cost:0.000001
Epoch 1900/2000, Cost:0.000000
Epoch 2000/2000, Cost:0.000000

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

import torch
import torch.nn as nn
import torch.nn.functional as F

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 MultivariateLinearRegressionModel(nn.Module):
    def __init__(self):
        super().__init__()
        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)

    #cost 계산
    cost=F.mse_loss(prediction,y_train)

    #cost로 H(x) 개선
    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.599609
Epoch  100/2000 Cost:0.225993
...
Epoch 1900/2000 Cost:0.200634
Epoch 2000/2000 Cost:0.199770

0개의 댓글