1 분 소요

이번에는 Logistic Regresiion을 nn.module을 써서 해보겠습니다.

기존과 방식은 크게 차이가 나지 않으나 sigmoid함수 부분이 조금 차이가 있습니다.

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

기본적인 셋팅은 늘 먹던걸로 하겠습니다.

Untitled

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)

데이터도 우리가 앞에서 logistic regression 실습을 할 때 썻던 걸로 쓰도록 하겠습니다.

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

여기서 우리는 기존에 썻던 torch.sigmoid가 아니라 nn.Sequential을 쓸 겁니다.

이 메서드의 역할은 바로 선형 회귀인 Wx+b의 식과 sigmoid식을 연결 해주는 메서드입니다.

물론 다른 수식과도 연결을 할 수 있습니다.

그렇기 때문에 nn.Linear(2,1)을 통해 x의 feature가 2개고 y의 feature가 1개인 선형 회귀 함수와 sigmoid함수를 nn.Sequential을 통해 이어준다고 생각하면 됩니다.

optimizer=optim.SGD(model.parameters(),lr=1)
epochs=1000
for epoch in range(epochs+1):
    hypothesis=model(x_train)
    loss=F.binary_cross_entropy(hypothesis,y_train)
    optimizer.zero_grad()
    loss.backward()
    optimizer.step()
    if epoch %10 ==0:
        prediction=hypothesis >= torch.FloatTensor([0.5])
        correct_prediction=prediction.float()==y_train
        accuracy=correct_prediction.sum().item()/len(correct_prediction)
        print('Epoch {:4d}/{} Cost: {:.6f} Accuracy {:2.2f}%'.format( # 각 에포크마다 정확도를 출력
            epoch, nb_epochs, loss.item(), accuracy * 100,
        ))

optimizer는 gradient descent를 쓰는데 여기서 model.parameters를 넣었기 때문에 따로 weight와 bias값을 넣지 않아도 됩니다.

왜냐하면 model.parameters에 weight와 bias의 정보가 다 들어있기 때문이죠

loss는 우리가 sigmoid함수를 통해 이진 분류를 하는 것이기 때문에 sigmoid 함수를 mse에 적용한 cross_entropy를 사용합니다.

그럼 한번 x_train을 넣어 예측을 시켜본 뒤 학습 뒤의 weight도 확인 해보도록 합시다.

model(x_train)
print(list(model.parameters()))

다음은 클래스로 회귀를 logistic regression을 해보도록 하겠습니다.

기본적인 셋팅은 다 똑같지만 Class만 추가해주시면 됩니다.

댓글남기기