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

SoYeong Gwon·2022년 6월 27일
0

DeepLearning Introduction

목록 보기
7/12
post-thumbnail
  • 파이토치의 대부분 구현체는 모델을 생성할때 class를 사용함.
  • 앞서 구현한 코드와 다른 점은 클래스로 모델을 구현했다는 점임.

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

(1) nn.module을 사용한 model 선언

model = nn.Sequential(
   nn.Linear(2, 1), # input_dim = 2, output_dim = 1
   nn.Sigmoid() # 출력은 시그모이드 함수를 거친다
)

(2) class를 사용한 model 선언

class BinaryClassifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(2,1)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self,x):
        return self.sigmoid(self.linear(x))
  • 클래스 형태의 모델은 nn.Module을 상속받음.
  • __init__()
    • 모델의 구조와 동작을 정의하는 생성자 정의
    • 객체가 갖는 속성값을 초기화하는 역할로 객체가 생성될때 자동으로 호출
    • super() 함수를 부르면 자동으로 nn.Module 속성을 가지고 초기화
  • forward()
    • 모델이 학습데이터를 입력받아서 forward 연산을 진행하는 함수
    • model 객체를 데이터와 함계 호출하면 자동으로 실행
    • H(x)H(x) 식에서 입력 xx로부터 yy를 얻는 것을 forward 연산이라고함.

2. 로지스틱 회귀 클래스로 구현하기

(1) 패키지 선언 및 초기화

import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)

(2) 학습 데이터 선언

x_data = [[1,2],[2,3],[3,1],[4,3],[5,3],[6,2]]
y_data = [[0],[0],[0],[1],[1],[1]]
x_train = torch.FloatTensor(x_data)
y_train = torch.FloatTensor(y_data)

(3) 클래스 및 모델 선언

class BinaryClassifier(nn.Module):
    def __init__(self):
        super().__init__()
        self.linear = nn.Linear(2,1)
        self.sigmoid = nn.Sigmoid()
    
    def forward(self,x):
        return self.sigmoid(self.linear(x))
model = BinaryClassifier()

(4) 모델 학습

# optimizer 설정
optimizer = optim.SGD(model.parameters(), lr=1)

nb_epochs = 1000
for epoch in range(nb_epochs+1):
    # H(x)
    hypothesis = model(x_train)

    # cost 계산
    cost = F.binary_cross_entropy(hypothesis, y_train)

    # cost로 H(x) 개선
    optimizer.zero_grad()
    cost.backward()
    optimizer.step()

    if epoch % 10 == 0:
        prediction = hypothesis >= torch.FloatTensor([0.5]) # 예측값이 0.5를 넘으면 True
        correct_prediction = prediction.float() == y_train # 실제값과 일치한 경우만 True
        accuracy = correct_prediction.sum().item()/len(correct_prediction) # 정확도 계산
        print('Epoch {:4d}/{} Cost: {:.6f} Accuracy {:2.2f}%'.format( # 각 에포크마다 정확도를 출력
            epoch, nb_epochs, cost.item(), accuracy * 100,
        ))
Epoch    0/1000 Cost: 0.539713 Accuracy 83.33%
Epoch   10/1000 Cost: 0.614853 Accuracy 66.67%
...
Epoch  980/1000 Cost: 0.020219 Accuracy 100.00%
Epoch  990/1000 Cost: 0.020029 Accuracy 100.00%
Epoch 1000/1000 Cost: 0.019843 Accuracy 100.00%

0개의 댓글