반응형
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과 같다.
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와 같다.
loss가 점점 줄어들었고 출력 값이 [0, 1, 1, 0]에 가까이 나와 성공적으로 학습이 되었다.
반응형
'Pytorch' 카테고리의 다른 글
CIFAR-10 CNN으로 학습하기 [Pytorch] (0) | 2022.05.12 |
---|---|
미니 배치(mini batch) [pytorch] (0) | 2022.04.26 |
XOR 문제 딥러닝 모델 구현 (2) [Pytorch] (0) | 2022.04.25 |
Pytorch, CUDA, cuDNN 설치 [windows 10] (0) | 2022.04.22 |