728x90
반응형
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 문제를 풀어 보겠습니다.
반응형
'IT > [Data Science]' 카테고리의 다른 글
[ML] 인공신경망 비선형 활성화함수 (Activation Function) (0) | 2022.02.22 |
---|---|
[ML] 다층 퍼셉트론 구현으로 XOR 문제 해결하기 (0) | 2022.02.22 |
[ML] 퍼셉트론(Perceptron) (0) | 2022.02.18 |
[ML] 머신 러닝 용어 이해하기 (0) | 2022.02.18 |
[DL] 단순, 다중 선형 회귀 구현하기 (PYTORCH) (0) | 2022.02.17 |