반응형
# neural network xor
#
# Created by netcanis on 2023/08/22.
#
import numpy as np
from graphviz import Digraph
'''
Input 0 -- w[0] -- Hidden 0
\ / \
\ / w2[0]
w[1] / \
\/ Output
/\ /
w[2] \ w2[1]
/ \ /
/ \ /
Input 1 -- w[3] -- Hidden 1
'''
# XOR 학습 데이터
x_data = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
y_data = np.array([[0], [1], [1], [0]])
# 신경망 파라미터 초기화
input_size = 2
hidden_size = 2
output_size = 1
learning_rate = 0.1
# 가중치와 편향 초기화 - 평균이 0이고 표준편자가 1인 랜덤 값으로 행렬을 생성한다. (-1.0 ~ 1.0)
w1 = np.random.randn(input_size, hidden_size) # 2x2 행렬
b1 = np.random.randn(hidden_size) # 1차원 배열 (첫번째 은닉층의 편향 벡터. 편향은 각 은닉층 뉴런의 활성화 값을 조정하는 역할.)
w2 = np.random.randn(hidden_size, output_size) # 2x1 행렬
b2 = np.random.randn(output_size) # 1차원 배열 (출력층의 편향 벡터. 출력층의 뉴런들을 편향하여 최종 예측 값을 만듬.)
# 활성화 함수 (시그모이드)
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 활성화 함수의 미분
def sigmoid_derivative(x):
return x * (1 - x)
# 학습 시작
epochs = 10000
for epoch in range(epochs):
# 순전파 (Forward Propagation)
z1 = np.dot(x_data, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
a2 = sigmoid(z2)
# 오차 계산
error = y_data - a2
# 역전파 (Backpropagation)
delta2 = error * sigmoid_derivative(a2)
delta1 = np.dot(delta2, w2.T) * sigmoid_derivative(a1)
# 가중치 업데이트
w2 += np.dot(a1.T, delta2) * learning_rate
w1 += np.dot(x_data.T, delta1) * learning_rate
# 예측 함수
def predict(input_data):
z1 = np.dot(input_data, w1) + b1
a1 = sigmoid(z1)
z2 = np.dot(a1, w2) + b2
a2 = sigmoid(z2)
return int(np.round(a2)[0])
# -----------------------------------------------------------------------
# TEST
# 학습 완료 후 예측
input_example = np.array([0, 1])
prediction = predict(input_example)
print("Input:", input_example)
print("Prediction:", prediction)
# 레이어 구조도 출력
# 그래프 생성
graph = Digraph(format='png', engine='dot')
graph.node('Input0', 'Input 0')
graph.node('Input1', 'Input 1')
graph.node('Hidden0', 'Hidden 0')
graph.node('Hidden1', 'Hidden 1')
graph.node('Output', 'Output')
graph.node('Bias1', 'Bias 1')
graph.node('Bias2', 'Bias 2')
# 그래프 속성 설정
graph.attr(rankdir='LR') # 좌에서 우로 방향 설정
# 입력 노드와 히든 노드 연결
graph.edge('Input0', 'Hidden0', label='w1[0]')
graph.edge('Input0', 'Hidden1', label='w1[1]')
graph.edge('Input1', 'Hidden0', label='w1[2]')
graph.edge('Input1', 'Hidden1', label='w1[3]')
# 히든 노드와 출력 노드 연결
graph.edge('Hidden0', 'Output', label='w2[0]')
graph.edge('Hidden1', 'Output', label='w2[1]')
# 바이어스 노드와 히든 노드 연결
graph.edge('Bias1', 'Hidden0', label='b1[0]')
graph.edge('Bias1', 'Hidden1', label='b1[1]')
graph.edge('Bias2', 'Output', label='b2[0]')
# 그래프 시각화 및 출력
graph.view()
반응형
'개발 > AI,ML,ALGORITHM' 카테고리의 다른 글
Tic-Tac-Toe 게임 제작 (2/4) - alpha–beta pruning (0) | 2023.09.12 |
---|---|
Tic-Tac-Toe 게임 제작 (1/4) - minimax (0) | 2023.09.12 |
SARSA (0) | 2023.08.28 |
Q-learning (0) | 2023.08.28 |
MNIST - TensorFlowLite (0) | 2023.07.19 |