import torch
import torch.nn as nn
import torch.nn.functional as F
import torch.optim as optim
torch.manual_seed(1)
# Dataset 설정
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__()
self.linear = nn.Linear(2,1)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
return self.sigmoid(self.linear(x))
# 모델 설정
model = BinaryClassifier()
# 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)
# 최적화
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 20/1000 Cost: 0.441875 Accuracy 66.67%
Epoch 30/1000 Cost: 0.373145 Accuracy 83.33%
... 중략 ...
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%
이전 챕터에서와 달라진 점은 단순히 모델을 클래스로 구현했다는 점 뿐이다.
다른 코드는 전부 동일하므로 클래스로 구현한 부분의 코드를 유심히 볼 필요가 있다.