티스토리 뷰
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]]
'인공지능' 카테고리의 다른 글
[인공지능] Keras로 MNIST 숫자 학습하기 (feat. Sequential 모델) (0) | 2022.09.16 |
---|---|
[인공지능] 딥러닝 express 연습문제 6장 (0) | 2022.09.14 |
[인공지능] 딥러닝 express 연습문제 4장 (1) | 2022.09.08 |
[인공지능] Sklearn + Numpy만으로 퍼셉트론 구현하기 (1) | 2022.09.07 |
[인공지능] Numpy로 경사하강법 구현하기 (0) | 2022.09.07 |
댓글