반응형

 

# 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
블로그 이미지

SKY STORY

,