import torch
# 입력 데이터 (0,0), (0,1), (1,0), (1,1)
x_train = torch.FloatTensor([[0, 0], [0, 1], [1, 0], [1, 1]])
# 정답 (XOR 연산의 결과)
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) # 출력레이어 바이어스
# 모델 학습을 위한 옵티마이저 설정
optimizer = torch.optim.SGD([w_h, b_h, w_o, b_o], lr=0.01) # 경사 하강법 사용
# 신경망 모델 정의 (딥러닝 1단계)
def H(x):
hidden1 = torch.relu(torch.matmul(x, w_h) + b_h) # 히든레이어에 ReLU 활성화 함수 적용
model = torch.sigmoid(torch.matmul(hidden1, w_o) + b_o) # 출력층에 Sigmoid 함수 적용
return model
# 모델 학습 (딥러닝 2단계)
for iter in range(200000):
# 비용 함수 (이진 교차 엔트로피)
cost = torch.mean((-1) * y_train * torch.log(H(x_train)) + (-1) * (1 - y_train) * torch.log(1 - H(x_train)))
optimizer.zero_grad() # 기울기를 0으로 초기화
cost.backward() # 기울기 계산
optimizer.step() # 가중치 업데이트
# 10000번마다 비용 출력
if iter % 10000 == 0:
print(iter, cost.detach().item())
# 모델 추론 (딥러닝 3단계)
model_result = H(x_train) # 학습한 모델로 예측
# 출력값을 0과 1로 변환 (0.5를 기준으로)
threshold = 0.5
model_result_1 = (model_result > threshold).float() # 0.5보다 크면 1, 아니면 0으로 설정
# 결과 출력
print("모델 예측 결과:", model_result)
print("이진 분류 결과:", model_result_1)
0 1.1424654722213745
10000 0.027784157544374466
20000 0.01048182975500822
30000 0.006286813411861658
40000 0.004447906278073788
50000 0.0034256326034665108
60000 0.002778000431135297
70000 0.0023323940113186836
80000 0.0020074297208338976
90000 0.0017604706808924675
100000 0.0015665559330955148
110000 0.0014104102738201618
120000 0.0012821569107472897
130000 0.0011748538818210363
140000 0.0010838652960956097
150000 0.0010056926403194666
160000 0.000937765056733042
170000 0.0008783783996477723
180000 0.0008258894085884094
190000 0.0007790738018229604
tensor([[0.0013],
[0.9998],
[0.9998],
[0.0013]], grad_fn=<SigmoidBackward0>)
tensor([[0.],
[1.],
[1.],
[0.]])