본문 바로가기

Programming/[Data Science]

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

반응형

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

필요한 도구들을 불러옵니다.

import torch
import torch.nn as nn
import torch.optim as optim

GPU 연산이 가능할 경우 GPU 연산을 할 수 있도록 설정해줍니다. 지금은 cpu로 연산을 진행하겠네요.

# GPU 연산이 가능할 경우에 GPU 연산을 할 수 있도록 설정 
device = 'cuda' if torch.cuda.is_available() else 'cpu' torch.manual_seed(777) if device == 'cuda': torch.cuda.manual_seed_all(777) print(f'연산 장치 : {device}')

XOR 문제에 해당하는 X, Y 값을 설정합니다. (x1, x2 가 같은 값일 때 0, 다르면 1)

# XOR 문제에 해당되는 입력과 출력을 정의
X = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]]).to(device)
Y = torch.FloatTensor([[0], [1], [1], [0]]).to(device)

단층 퍼셉트론을 구현하고, 활성화 함수는 시그모이드 함수를 사용합니다.

# 1개의 뉴런을 가지는 단층 퍼셉트론을 구현, 활성화 함수는 시그모이드 함수를 사용 
linear = nn.Linear(2, 1, bias=True) 
sigmoid = nn.Sigmoid() 
model = nn.Sequential(linear, sigmoid).to(device) 

이진 분류 문제이므로 손실 함수는 바이너리 크로스 엔트로피 함수를 사용하고, 옵티마이저는 SGD로 경사하강법을 사용합니다.

# 0 또는 1을 예측하는 이진 분류 문제이므로 크로스엔트로피 함수 사용
# nn.BCELoss()는 이진 분류에 사용하는 크로스엔트로피 함수
criterion = nn.BCELoss().to(device)
optimizer = optim.SGD(model.parameters(), lr=1) # 경사하강법, 학습률 1

2. 학습 진행

10001번의 에포크를 수행합니다.

#10,001번의 에포크 수행. 0번 에포크부터 10,000번 에포크까지.
for step in range(10001): 
    optimizer.zero_grad()
    hypothesis = model(X)

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

    if step % 100 == 0: # 100번째 에포크마다 비용 출력
        print(step, cost.item())

이때 200 에포크부터 비용이 줄지 않는 것을 확인 할 수 있습니다.

0 0.7273974418640137
100 0.6931476593017578
200 0.6931471824645996
... (중략) ...
10000 0.6931471824645996

단층 퍼셉트론은 XOR 문제를 풀 수 없기 때문에 학습이 제대로 되지 않는 것을 볼 수 있었습니다. 다음엔 다층 퍼셉트론을 이용하여 XOR 문제를 풀어 보겠습니다.


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

Pytorch

반응형