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.50.5])
    b = -0.7
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
 
print (AND(00))
print (AND(10))
print (AND(01))
print (AND(11))
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(00))
print (NAND(10))
print (NAND(01))
print (NAND(11))
 
        
 
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.50.5])
    b = -0.4
    tmp = np.sum(w*x) + b
    if tmp <= 0:
        return 0
    else:
        return 1
 
print (OR(00))
print (OR(10))
print (OR(01))
print (OR(11))
 
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