728x90
반응형
단층 퍼셉트론은 직선으로 구분할 수 있는 문제 해결이 가능한데 XOR 문제의 경우 곡선으로 구간을 나누어야 문제 해결이 가능했습니다.
)
왼쪽 좌표평면과 같은 문제를 해결하기 위해 다층 퍼셉트론을 구현하여 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)
위 인공신경망을 그림으로 표현하면 다음과 같습니다.
비용함수와 옵티마이저를 선언합니다. 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으로 문제를 해결하는 모습을 보여줍니다.
반응형
'IT > [Data Science]' 카테고리의 다른 글
[ML] pytorch로 다층 퍼셉트론 구현하여 손글씨 분류 (0) | 2022.02.22 |
---|---|
[ML] 인공신경망 비선형 활성화함수 (Activation Function) (0) | 2022.02.22 |
[ML] 단층 퍼셉트론으로 XOR 문제 구현하기 (0) | 2022.02.18 |
[ML] 퍼셉트론(Perceptron) (0) | 2022.02.18 |
[ML] 머신 러닝 용어 이해하기 (0) | 2022.02.18 |