import torch
# 학습 데이터 (XOR 문제)
x_train = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]]) # 입력값
y_train = torch.FloatTensor([[0], [1], [1], [0]]) # 출력값
# 히든 레이어 뉴런 수
nH1 = 3
# 히든 레이어 가중치와 바이어스
w_h = torch.randn([2, nH1], requires_grad=True) # 히든 레이어의 가중치
b_h = torch.randn([nH1], requires_grad=True) # 히든 레이어의 바이어스
# 출력 레이어 가중치와 바이어스
w_o = torch.randn([nH1, 1], requires_grad=True) # 출력 레이어의 가중치
b_o = torch.randn([1], requires_grad=True) # 출력 레이어의 바이어스
# 옵티마이저 설정 (SGD 사용)
optimizer = torch.optim.SGD([w_h, b_h, w_o, b_o], lr=0.01) # 학습 속도는 0.01로 설정
# 모델 함수 정의
def H(x):
# 히든 레이어 계산 (sigmoid 활성화 함수 사용)
hidden1 = torch.sigmoid(torch.matmul(x, w_h) + b_h)
# 출력 레이어 계산
model = torch.sigmoid(torch.matmul(hidden1, w_o) + b_o)
return model
# 모델 학습
for iter in range(200000): # 학습을 20만 번 반복
# 손실 함수 (이진 분류를 위한 로그 손실)
cost = torch.mean(
(-1) * y_train * torch.log(H(x_train)) + (-1) * (1 - y_train) * torch.log(1 - H(x_train))
)
optimizer.zero_grad() # 이전의 경사를 초기화
cost.backward() # 경사를 계산
optimizer.step() # 가중치와 바이어스를 업데이트
# 10000번마다 손실 값 출력
if iter % 10000 == 0:
print(iter, cost.detach().item())
# 학습 데이터에 대한 예측 결과 확인
model_result = H(x_train) # 학습 데이터로 예측 수행
print(model_result)
# 예측값을 0.5 기준으로 0 또는 1로 변환
threshold = 0.5
binary_result = (model_result > threshold).float()
print(binary_result)
0 1.2609624862670898
10000 0.3532853424549103
20000 0.10110002011060715
30000 0.05054212734103203
40000 0.032785069197416306
50000 0.02404860220849514
60000 0.018916349858045578
70000 0.015558074228465557
80000 0.013196679763495922
90000 0.01145055890083313
100000 0.010107052512466908
110000 0.009042548947036266
120000 0.008178873918950558
130000 0.0074623823165893555
140000 0.006863342598080635
150000 0.006352500058710575
160000 0.005910862237215042
170000 0.0055259596556425095
180000 0.005188432056456804
190000 0.004891593009233475
tensor([[0.0013],
[0.9956],
[0.9948],
[0.0076]], grad_fn=<SigmoidBackward0>)