XOR게이트를 퍼셉트론으로 구현해보자
2018. 10. 12. 16:59ㆍ해봤던것들
XOR 게이트
XOR게이트는 위와 같이 Output이 0110 임을 알 수 있습니다.
때문에 일반적인 퍼셉트론 알고리즘으로는 구현할 수 없습니다.
일단 아래 그림을 보고 차이점을 알아봅시다.
OR게이트와 XOR게이트의 차이점
위의 그림을 보면 OR게이트와 XOR게이트의 차이점이 보입니다.
OR은 퍼셉트론 하나만으로도 1과 0을 나눌수 있었지만
(선형)>단층 퍼셉트론으로 표현 가능
XOR은 불가능합니다.
(비선형)>다층 퍼셉트론으로 표현 가능
그래서 등장한 것이 다층 퍼셉트론입니다.
쉽게 말하자면 선을 여러 개 긋는다는 것입니다.
XOR게이트를 구현하기 위해서는 앞서 구했던 AND , NAND, OR 게이트 퍼셉트론이 필요합니다.
AND 편향 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
import numpy as np
def AND(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print (AND(0, 0))
print (AND(1, 0))
print (AND(0, 1))
print (AND(1, 1))
|
cs |
NAND 편향 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
import numpy as np
def NAND(x1, x2):
x = np.array([x1, x2])
w = np.array([-0.5, -0.5])
b = 0.7
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print (NAND(0, 0))
print (NAND(1, 0))
print (NAND(0, 1))
print (NAND(1, 1))
|
cs |
OR 편향 사용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
import numpy as np
def OR(x1, x2):
x = np.array([x1, x2])
w = np.array([0.5, 0.5])
b = -0.4
tmp = np.sum(w*x) + b
if tmp <= 0:
return 0
else:
return 1
print (OR(0, 0))
print (OR(1, 0))
print (OR(0, 1))
print (OR(1, 1))
|
cs |
위의 퍼셉트론을 구현한 함수들을 사용해서 XOR게이트를 구하는 퍼셉트론을 만듭니다.
NAND와 OR로 x1과 x2값을 넣고 나온 결과를 다시 y에 넣는 2층 구조의 퍼셉트론입니다.
# XOR(x1, x2) = AND(NAND(x1, x2), OR(x1, x2))
def XOR(x1, x2):
s1 = NAND(x1, x2)
s2 = OR(x1, x2)
y = AND(s1, s2)
return y
print("XOR")
print(XOR(0, 0)) # 0
print(XOR(0, 1)) # 1
print(XOR(1, 0)) # 1
print(XOR(1, 1)) # 0
정말 맞는지 대입해볼까요?
0과 0을 입력해주면 s1은 1 s2는 0 → 값을 AND게이트에 넣으면? 0
0과 1을 입력해주면 s1은 1 s2는 1 → 값을 AND게이트에 넣으면? 1
1과 0을 입력해주면 s1은 1 s2는 1 → 값을 AND게이트에 넣으면? 1
1과 1을 입력해주면 s1은 0 s2는 1 → 값을 AND게이트에 넣으면? 0