Pytorch

XOR 문제 딥러닝 모델 구현 (1) [Pytorch]

JEO96 2022. 4. 24. 21:37
반응형

 

 

1. 서론

학부시절 딥러닝 첫걸음 책으로 딥러닝을 처음 접했다. 단층 신경망으로 풀 수 없는 XOR 문제를 심층 신경망으로 해결하는 코드가 교재에 matlab으로 구현되어있는데 이것을 Python의 Pytorch로 구현해 보았다.

딥런이 첫걸음 표지

2. 본론

  • input: [0, 0, 1], [0, 1, 1], [1, 0, 1], [1, 1, 1]
  • output: [0], [1], [1], [0]

위와 같이 첫 번째와 두 번째 숫자가 같으면 0 다르면 1을 출력하는 모델을 구현하였다.

모델 모양은 그림 1과 같다.

그림 1

3개의 입력을 받아 5개의 은닉 노드를 가지고 출력이 1개인 딥러닝 모델이다.

코드는 아래와 같다.

import torch

device = "cuda" if torch.cuda.is_available() else "cpu"  # 장치 선택

# 입력
X = torch.Tensor([[0, 0, 1],
                  [0, 1, 1],
                  [1, 0, 1],
                  [1, 1, 1]]).to(device)

# 정답
Y = torch.Tensor([[0],
                  [1],
                  [1],
                  [0]]).to(device)


# XOR 모델
class XOR(torch.nn.Module):
    def __init__(self):
        super().__init__()
        self.layer1 = torch.nn.Linear(3, 5)
        self.layer2 = torch.nn.Linear(5, 1)

    def forward(self, x):
        x = torch.relu(self.layer1(x))
        x = torch.sigmoid(self.layer2(x))
        return x


model = XOR().to(device)

criterion = torch.nn.BCELoss().to(device)  # Binary Cross Entropy
optimizer = torch.optim.SGD(model.parameters(), lr=0.02)  # SGD 사용, 학습률 0.02
for t in range(10000):
    y_pred = model(X)

    loss = criterion(y_pred, Y)  # loss 계산
    if t % 1000 == 999:
        print(f'epoch: {t + 1}/{10000}, loss: {loss.item()}')

    optimizer.zero_grad()  # 초기화
    loss.backward()  # 역전파
    optimizer.step()  # 가중치 갱신

with torch.no_grad():
    print(f'출력: {model(X)}')

gpu를 사용하여 연산하는 코드이며 비용 함수(손실 함수)를 Cross Entropy를 사용하였다.

코드의 출력 값은 그림 2와 같다.

그림 2

loss가 점점 줄어들었고 출력 값이 [0, 1, 1, 0]에 가까이 나와 성공적으로 학습이 되었다.

반응형