머신러닝&딥러닝/모두를 위한 딥러닝

[머신러닝 실습] Logistic Regression(로지스틱 회귀) with PyTorch

Chaerry._o 2023. 9. 20. 19:26
반응형

이 글은 PyTorchZeroToAll을 기반으로 작성한 글입니다.

 

 

[머신러닝 이론] Logistic Regression(로지스틱 회귀)

이 글은 모두를 위한 딥러닝 시즌1을 기반으로 작성한 글입니다. [머신러닝 이론] Multiple Linear Regression(다중 선형 회귀) 이 글은 모두를 위한 딥러닝 시즌1을 기반으로 작성한 글입니다. [머신러닝

chaerrylog.tistory.com

위 글에서 로지스틱 회귀에 대해서 설명했다. 이 내용을 토대로 파이토치를 사용해 실습을 진행한다.


from torch import tensor
from torch import nn
from torch import sigmoid
import torch.nn.functional as F
import torch.optim as optim

필요한 파이토치 도구들을 import 한다.

 

x_data = tensor([[1.0], [2.0], [3.0], [4.0]])
y_data = tensor([[0.], [0.], [1.], [1.]])

x_data와 y_data에 tensor() 함수를 사용해 입력된 데이터를 복사하여 tensor로 변환하여 저장한다. 

 

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.linear = nn.Linear(1, 1)

    def forward(self, x):
        y_pred = sigmoid(self.linear(x))
        return y_pred

torch.nn.Module은 PyTorch의 모든 뉴럴 네트워크 모듈의 기본 클래스이다. 일반적인 모델들은 이 클래스를 상속받아야 한다.

 

super(Model, self).__init__()로 부모 클래스를 초기화해줘서 부모 클래스의 속성을 하위 class가 받아오도록 한다.

 

torch.nn.Linear()은 저장된 weight와 bias를 사용하여 입력에 linear transformation을 적용하는 모듈이다. 괄호 안에 입력되는 x의 차원과 출력되는 y의 차원을 입력한다. (1, 1)은 하나의 입력에 대해 하나의 출력이 나온다는 것이다.

 

forward() 함수는 순전파 동작이 자동으로 수행되게 하는 함수이다. y_pred는 self.linear(x)를 통해 선형 변환이 된 값을 sigmoid()의 입력으로 넣어준다.

 

 

model = Model()

criterion = nn.BCELoss(reduction='mean')
optimizer = optim.SGD(model.parameters(), lr=0.01)

model에 위에서 만든 Model()을 넣어준다.

 

torch.nn.BCELoss는 Binary Cross Entropy 손실 함수를 구현한 PyTorch의 클래스이다.

reduction은 손실 값을 어떻게 줄일지 지정하는 인수이다. 우리는 mean을 사용한다.

 

torch.optim.SGD는 확률적 경사 하강법(Stochastic Gradient Descent) 최적화 알고리즘을 구현한 PyTorch의 클래스이다. SGD는 각 업데이트 스텝마다 무작위로 선택된 미니 배치에 대한 손실 함수의 기울기를 사용하여 모델을 업데이트한다.

 

model.parameters()는 모델의 학습 가능한 파라미터들을 반환한다. lr은 학습률을 지정하는 인수이다.

 

for epoch in range(1000):
    y_pred = model(x_data)

    loss = criterion(y_pred, y_data)
    print(f'Epoch {epoch + 1}/1000 | Loss: {loss.item():.4f}')

    optimizer.zero_grad()
    loss.backward()
    optimizer.step()

1000번 모델을 학습한다.

 

y_pred는 모델에 x_data를 넣어 구한다.

 

loss는 BCE 손실 함수에 예측값과 실제값을 넣어 구한다.

print() 함수를 사용해 epoch에 따른 loss 값을 출력한다.

 

loss 값 출력

 

optimizer.zero_grad()를 통해 변화된 기울기 값을 초기화한다.

loss.backward()를 통해 기울기를 계산한다.

optimizer.step()을 통해 기울기를 업데이트한다.

 

print(f'\nLet\'s predict the hours need to score above 50%\n{"=" * 50}')
hour_var = model(tensor([[1.0]]))
print(f'Prediction after 1 hour of training: {hour_var.item():.4f} | Above 50%: {hour_var.item() > 0.5}')
hour_var = model(tensor([[7.0]]))
print(f'Prediction after 7 hours of training: {hour_var.item():.4f} | Above 50%: {hour_var.item() > 0.5}')

model에 1.0와 7.0의 tensor를 입력하여 각 1.0시간과 7.0시간 뒤의 예측값을 계산한다.

 

1.0시간과 7.0시간 뒤의 예측값이 0.5보다 큰지 판단하고 크면 True, 작으면 False를 출력한다.

 

 

<Reference>

1. https://youtu.be/GAKTBQn7yKo?si=SEb9lqSlJbu_aiyN 

2. https://wikidocs.net/60037

3. https://wikidocs.net/195022

 

반응형