from palette import colorful_colors

XOR를 학습할 수 있는 다층 신경망 만들기 본문

AI/Pytorch

XOR를 학습할 수 있는 다층 신경망 만들기

colorful-palette 2023. 4. 8. 20:58

xor은 비선형이므로 한 층의 퍼셉트론으로 처리할 수 없기 때문에 다층 퍼셉트론을 사용합니다.

아래의 코드는 활성화함수로 시그모이드 함수를 사용한 다층 신경망을 구현한 코드입니다.

 

 

<구현>

import numpy as np

# XOR 입력과 출력(정답) 데이터 준비
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
Y = np.array([[0], [1], [1], [0]])

# 가중치와 바이어스 초기화
W1 = np.array([[1.5 , -0.5],[-0.5, -1.0]])  
b1 = np.array([0., 0.])
W2 = np.array([[0.5], [-0.5]]) 
b2 = np.array([0.])


# 활성화 함수 - 시그모이드 함수
def sigmoid(x):
    return 1 / (1 + np.exp(-x))

# 학습률
lr = 0.1

# 학습(순전파, 역전파를 epoch만큼 반복)
for _ in range(20000):
    # 순전파 과정
    v1 = np.dot(X, W1) + b1
    h1 = sigmoid(v1)
    v2 = np.dot(h1, W2) + b2
    output = sigmoid(v2)
    
    # 역전파 과정
    error = Y - output                                      # 출력과 정답 사이 차이
    gradiant2 = error * output * (1 - output)                # error를 이용해 계층2의 미분값 계산
    gradiant1 = gradiant2.dot(W2.T) * layer1 * (1 - h1)   # error를 이용해 계층1의 미분값 계산
    
    # 역전파를 이용해 w, b 업데이트
    W2 += np.dot(h1.transpose(), gradiant2) * lr          # W2 업데이트
    b2 += np.sum(gradiant2, axis = 0) * lr                # b2 업데이트
    W1 += np.dot(X.transpose(), gradiant1) * lr           # W1 업데이트
    b1 += np.sum(gradiant1, axis=0) * lr                  # b1 업데이트

 

 

<테스트>

# 테스트용 함수 작성

# 한번 추론하는 신경망 구성(순전파)
def fit(x):
    v1 = np.dot(x, W1) + b1   
    layer1 = sigmoid(v1) 
    v2 = np.dot(layer1, W2) + b2
    layer2 = sigmoid(v2)   
    return layer2
def predict(X):
      return np.where(fit(X) > 0.5, 1, 0)    # 반올림하여 0.5를 기준으로 1 혹은 0 출력
      
X = np.array([[0,0], [1,0], [0,1], [1,1]])
for x in X:
    print("입력:", x)
    print("출력:",predict(x))