Pytorch

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

JEO96 2022. 4. 25. 20:52
반응형

 

 

1. 서론

지난 글 XOR 문제 딥러닝 모델 구현 (1) [Pytorch]에서 input이 3개인 모델을 구현하였는데 이번엔 필요한 인풋 2개만 사용하여 은닉층의 최소 개수를 살펴보고자 한다.

 

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

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

jeo96.tistory.com

2. 본론

지난 글에서 사용하였던 코드에서 입력 노드와 은닉 노드의 개수만 수정하였으며 모델 모양은 그림 1과 같다.

그림 1

코드는 아래와 같으며 지난 코드에서 Linear의 숫자만 수정하였다.

import torch

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

# 입력
X = torch.Tensor([[0, 0],
                  [0, 1],
                  [1, 0],
                  [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(2, 2)
        self.layer2 = torch.nn.Linear(2, 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)}')

테스트를 해보니 은닉층의 노드 개수가 의외로 최소한의 노드 개수인 2개로도 학습이 되었다. 

 

반응형