티스토리 뷰

 

 

[인공지능] 다층 퍼셉트론 (MLP)과 역전파 알고리즘

아래 글에 이어 작성된 글입니다. [인공지능] 인공신경망의 시작, 퍼셉트론 아래 글에 이어 작성된 글입니다. [인공지능] 머신러닝과 인공신경망 아래 글에 이어 작성된 글입니다. [인공지능] 전

munak.tistory.com

 

 Numpy를 이용해 역방향전파을 구현합니다.

 


역방향 전파

XOR연산을 역방향 전파 계산하여 EPOCH가 증가함에 따라 MSE가 어떻게 감소하는지 그래프로 출력하여라.

 

가중치와 바이어스는 np.random.rand()를 사용해 [0, 1)범위의 난수로 초기화 하고 학습률은 0.2로 epoch는 10000으로 설정하여 학습을 진행하였습니다. 

 

import numpy as np
import matplotlib.pyplot as plt

# 입력유닛, 은닉유닛, 출력유닛의 개수
# inputs, hiddens, outputs = 2, 2, 1


# 훈련 샘플과 정답
X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
T = np.array([[0], [1], [1], [0]])

# 난수로 가중치와 바이어스 넘파이 배 초기화
W1 = np.random.rand(2, 2)
W2 = np.random.rand(2, 1)
B1 = np.random.rand(2)
B2 = np.random.rand(1)

learning_rate = 0.2  # 학습률
error_list = []  # MSE를 저장할 리스트


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


# 시그모이드 함수의 미분
def actf_deriv(x):
    return x * (1 - x)


# 순방향 전파 계산
def predict(x):
    layer0 = x  # 입력을 layer0에 대입한다. 
    Z1 = np.dot(layer0, W1) + B1  # 행렬의 곱을 계산한다. 
    layer1 = actf(Z1)  # 활성화 함수를 적용한다. 
    Z2 = np.dot(layer1, W2) + B2  # 행렬의 곱을 계산한다. 
    layer2 = actf(Z2)  # 활성화 함수를 적용한다. 
    return layer0, layer1, layer2


# 역방향 전파 계산
def fit():
    global W1, W2, B1, B2, error_list  # 우리는 외부에 정의된 변수를 변경해야 한다. 
    for i in range(10000):  # 만번 반복한다. 
        MSE = 0
        for x, y in zip(X, T):  # 학습 샘플을 하나씩 꺼낸다. 
            x = np.reshape(x, (1, -1))  # 2차원 행렬로 만든다. 
            y = np.reshape(y, (1, -1))

            layer0, layer1, layer2 = predict(x)  # 순방향 계산

            layer2_error = layer2 - y  # 출력층의 오차 계산
            layer2_delta = layer2_error * actf_deriv(layer2)  # 출력층의 델타 계산 

            layer1_error = np.dot(layer2_delta, W2.T)  # 은닉층의 오차 계산 
            layer1_delta = layer1_error * actf_deriv(layer1)  # 은닉층의 델타 계산 

            # 가중치 갱신
            W2 += -learning_rate * np.dot(layer1.T, layer2_delta)
            W1 += -learning_rate * np.dot(layer0.T, layer1_delta)
            B2 += -learning_rate * np.sum(layer2_delta, axis=0)
            B1 += -learning_rate * np.sum(layer1_delta, axis=0)

        MSE = (layer2_error * layer2_error) / 2  # 가중치 갱신후 MSE 구하기
        error_list.append(MSE.reshape(-1))  # 구한 MSE 리스트 요소로 추가


def test():
    for x, y in zip(X, T):
        x = np.reshape(x, (1, -1))  # 샘플을 꺼내 2차원 행렬로 변
        layer0, layer1, layer2 = predict(x)  # 출력값을 계산
        print(x, y, layer2)  # 출력층의 값을 출력


fit()  # 학습
test()  # 테스트

# Epochs에 MSE 변화 그래프 생성
plt.plot(range(1, len(error_list) + 1), error_list)

# 그래프 x좌표 라벨 설정
plt.xlabel('Epochs')

# 그래프 y좌표 라벨 설정
plt.ylabel('MSE')

# 화면에 그래프 출력
plt.show()

 

 

위 코드를 여러 번 실행시킨결과 다음과 같은 그래프와 결과가 출력되는 것을 확인할 수 있었습니다. 

 

 

 

# 1
[[0 0]] [0] [[0.03267186]]
[[0 1]] [1] [[0.96879096]]
[[1 0]] [1] [[0.96335176]]
[[1 1]] [0] [[0.02905722]]

# 2
[[0 0]] [0] [[0.03413099]]
[[0 1]] [1] [[0.96957215]]
[[1 0]] [1] [[0.96960371]]
[[1 1]] [0] [[0.03215231]]

# 3
[[0 0]] [0] [[0.03823389]]
[[0 1]] [1] [[0.96585557]]
[[1 0]] [1] [[0.96581817]]
[[1 1]] [0] [[0.03612371]]
댓글
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Total
Today
Yesterday