반응형
Logistic Regression
- Logistic Classification과 동일
- binary classification으로 결과값이 0과 1중에 한개일거다
- P(x=1) = 1-P(x=0) -> X가 1일확률 = 1- X가 0일확률
(이미지 출처: Boostcourse AI Tech Pre Course)H(x) = P(x=1;w) = 1 - P(x=0;w)
- weight update Gradient Discent
(이미지 출처: Boostcourse AI Tech Pre Course)
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
# 항상 같은 결과를 주기위해 seed
torch.manual_seed(1)
# Data
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)
W = torch.zeros((2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)
optimizer = optim.SGD([W,b], lr=1)
nb_epochs = 1000
for epoch in range(nb_epochs+1):
# H(x)
# hypothesis = 1 / (1+torch.exp(-(x_train.matmul(W)+b)))
# torch에서 제공하는 sigmoid로 대체
hypothesis = torch.sigmoid(x_train.matmul(W)+b)
# Cost Function
cost = F.binary_cross_entropy(hypothesis, y_train)
# Cost로 Optim 계선
# zero_grad()를 사용하지 않으면 기존의 grad에 계속 더하게됨
optimizer.zero_grad()
# 역전파 단계
cost.backward()
# gradient를 사용하여 cost를 mimize하는 방향으로 W와 b를 업데이트함
optimizer.step()
if epoch %100 ==0:
print(f"epoch: {epoch}/{nb_epochs} cost: {cost}")
With Binary Classifier
import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
# 항상 같은 결과를 주기위해 seed
torch.manual_seed(1)
# Data
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)
class BinaryClassifier(nn.Module):
def __init__(self):
super().__init__()
# W와 B를 갖고있는 nn.Linear
self.linear = nn.Linear(2,1)
self.sigmoid = nn.Sigmoid()
def forward(self,x):
return self.sigmoid(self.linear(x))
model = BinaryClassifier()
optimizer = optim.SGD(model.parameters(), lr=1)
nb_epochs = 100
for epoch in range(nb_epochs+1):
hypothesis = model(x_train)
cost = F.binary_cross_entropy(hypothesis, y_train)
optimizer.zero_grad()
cost.backward()
optimizer.step()
if epoch%10 == 0 :
prediction = hypothesis>=torch.FloatTensor([0.5])
correct_prediction = prediction.float()==y_train
#.sum() 결과로 tensor(6) 가 나오기때문에 .item()으로 안의 6을 가져옴
accuracy = correct_prediction.sum().item()/len(correct_prediction)
print(f'Epoch{epoch} accuracy {accuracy * 100} cost {cost}')
->
Epoch0 accuracy 83.33333333333334 cost 0.5397130846977234
Epoch10 accuracy 66.66666666666666 cost 0.6148526072502136
Epoch20 accuracy 66.66666666666666 cost 0.4418751299381256
Epoch30 accuracy 83.33333333333334 cost 0.37314531207084656
Epoch40 accuracy 83.33333333333334 cost 0.31635817885398865
Epoch50 accuracy 83.33333333333334 cost 0.26609399914741516
Epoch60 accuracy 100.0 cost 0.22049756348133087
Epoch70 accuracy 100.0 cost 0.18209488689899445
Epoch80 accuracy 100.0 cost 0.15729932487010956
Epoch90 accuracy 100.0 cost 0.1440911740064621
Epoch100 accuracy 100.0 cost 0.1342717856168747
반응형
'부스트캠프 AI Tech 2기 > Precourse' 카테고리의 다른 글
Deep Learing TIPS (0) | 2021.08.01 |
---|---|
Softmax Classification (0) | 2021.08.01 |
Minibatch Gradient Descent (0) | 2021.08.01 |
Multivariate Linear Regression (0) | 2021.08.01 |
Gradient Descent 심화 (0) | 2021.08.01 |