본문 바로가기

Programming/[Data Science]

[ML] 다층 퍼셉트론 구현으로 XOR 문제 해결하기

반응형

단층 퍼셉트론은 직선으로 구분할 수 있는 문제 해결이 가능한데 XOR 문제의 경우 곡선으로 구간을 나누어야 문제 해결이 가능했습니다.

img

)

curve

왼쪽 좌표평면과 같은 문제를 해결하기 위해 다층 퍼셉트론을 구현하여 XOR 문제를 확인해보겠습니다.


1. 파이토치로 다층 퍼셉트론 구현하기

필요한 모듈을 임포트합니다.

import torch
import torch.nn as nn

device = 'cuda' if torch.cuda.is_available() else 'cpu'     # GPU 연산 확인

# 랜덤시드 고정
torch.manual_seed(777)
if device == 'cuda':
    torch.cuda.manual_seed_all(777)


# XOR 문제 입출력 정의
X = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]]).to(device)
Y = torch.FloatTensor([[0], [1], [1], [0]]).to(device)

은닉층이 3개인 인공 신경망 설계

model = nn.Sequential(
          nn.Linear(2, 10, bias=True), # input_layer = 2, hidden_layer1 = 10
          nn.Sigmoid(),
          nn.Linear(10, 10, bias=True), # hidden_layer1 = 10, hidden_layer2 = 10
          nn.Sigmoid(),
          nn.Linear(10, 10, bias=True), # hidden_layer2 = 10, hidden_layer3 = 10
          nn.Sigmoid(),
          nn.Linear(10, 1, bias=True), # hidden_layer3 = 10, output_layer = 1
          nn.Sigmoid()
          ).to(device)

위 인공신경망을 그림으로 표현하면 다음과 같습니다.

img

비용함수와 옵티마이저를 선언합니다. nn.BCELoss()는 이진 분류에서 사용하는 크로스엔트로피 함수입니다.

criterion = torch.nn.BCELoss().to(device)
optimizer = torch.optim.SGD(model.parameters(), lr=1)  # modified learning rate from 0.1 to 1

총 10,001번의 에포크를 수행, 각 에포크마다 역전파가 수행된다고 보면 되겠습니다. (가중치 업데이트) ``` for epoch in range(10001): optimizer.zero_grad() # forward 연산 hypothesis = model(X)

# 비용 함수
cost = criterion(hypothesis, Y)
cost.backward()
optimizer.step()

# 100의 배수에 해당되는 에포크마다 비용을 출력
if epoch % 100 == 0:
    print(epoch, cost.item())

비용이 최소화되는 방향으로 가중치와 편향(W, b)이 업데이트 됩니다.

2. 학습된 다층 퍼셉트론의 예측값 확인하기

아래 코드를 통해 모델이 XOR 문제를 풀 수 있는지 테스트 합니다.

with torch.no\_grad():  
hypothesis = model(X)  
predicted = (hypothesis > 0.5).float()  
accuracy = (predicted == Y).float().mean()  
print('모델의 출력값(Hypothesis): ', hypothesis.detach().cpu().numpy())  
print('모델의 예측값(Predicted): ', predicted.detach().cpu().numpy())  
print('실제값(Y): ', Y.cpu().numpy())  
print('정확도(Accuracy): ', accuracy.item())
모델의 출력값(Hypothesis):  [[1.1168801e-04]
 [9.9982882e-01]
 [9.9984229e-01]
 [1.8529482e-04]]
모델의 예측값(Predicted):  [[0.]
 [1.]
 [1.]
 [0.]]
실제값(Y):  [[0.]
 [1.]
 [1.]
 [0.]]
정확도(Accuracy):  1.0

실제값은 0, 1, 1, 0이며 예측값은 0, 1, 1, 0으로 문제를 해결하는 모습을 보여줍니다.


출처 : Pytorch로 시작하는 딥 러닝 입문

Pytorch

반응형