일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
Tags
- 3Dreconstruction
- 백준
- 싸움땅
- 토끼와 경주
- 루돌프의반란
- 수영대회결승전
- 이진탐색
- BFS
- dfs
- 시뮬레이션
- DenseDepth
- 마이크로프로세서
- 코드트리
- 조합
- 왕실의기사대결
- 소프티어
- ARM
- 구현
- 삼성기출
- ICER
- 마법의숲탐색
- 순서대로방문하기
- ros
- ISER
- 포탑부수기
- 나무박멸
- 코드트리빵
- DP
- 슈퍼컴퓨터클러스터
- Calibration
Archives
- Today
- Total
from palette import colorful_colors
XOR를 학습할 수 있는 다층 신경망 만들기 본문
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))