2018. 10. 9. 16:52ㆍ해봤던것들
구현해볼 논리 회로는 AND NAND OR XOR 이렇게 네가지 논리 회로입니다.
구현하기에 앞서서
각각의 논리 회로를 알아봅시다.
진리표를 보면 AND 게이트는 A와 B가 모두 1일때 output이 1이 됩니다.
퍼셉트론을 만들기 위해서는 가중치와 임계값을 주어야 합니다.
예를들어 (w1, w2, 임계값)을 (0.5, 0.5, 0.7) 이렇게 준다고 하면
조건이 만족할까요? 하나씩 해봅시다.
0 x 0.5 + 0 x 0.5 = 0.7보다 작거나 같은 값이기 때문에 0을 반환합니다.
1 x 0.5 + 0 x 0.5 = 0.7보다 작거나 같은 값이기 때문에 0을 반환합니다.
0 x 0.5 + 1 x 0.5 = 0.7보다 작거나 같은 값이기 때문에 0을 반환합니다.
1 x 0.5 + 1 x 0.5 = 0.7보다 큰 값이기 때문에 1을 반환합니다.
NAND 게이트는 Not AND 게이트를 뜻합니다.
따라서 output값을 AND 게이트와 모두 반대로 가지고 있습니다.
AND게이트의 매개변수들의 부호를 반전하면 됩니다.
0 x -0.5 + 0 x -0.5 = -0.7보다 큰 값이기 때문에 1을 반환합니다.
1 x -0.5 + 0 x -0.5 = -0.7보다 큰 값이기 때문에 1을 반환합니다.
0 x -0.5 + 1 x -0.5 = -0.7보다 큰 값이기 때문에 1을 반환합니다.
1 x -0.5 + 1 x -0.5 = -0.7보다 작거나 같은 값이기 때문에 0을 반환합니다.
0 x 0.5 + 0 x 0.5 = 0.4보다 작거나 같은 값이기 때문에 0을 반환합니다.
1 x 0.5 + 0 x 0.5 = 0.4보다 큰 값이기 때문에 1을 반환합니다.
0 x 0.5 + 1 x 0.5 = 0.4보다 큰 값이기 때문에 1을 반환합니다.
1 x 0.5 + 1 x 0.5 = 0.4보다 큰 값이기 때문에 1을 반환합니다.
조건을 만족하는 값들은 이외에도 무수히 많습니다.
????
AND게이트부터 간단하게 구현해보겠습니다.
1 2 3 4 5 6 7 8 9 10 11 12 | def AND(x1, x2): w1, w2, theta = 0.5, 0.5, 0.7 tmp = x1*w1 + x2*w2 if tmp <= theta: return 0 elif tmp > theta: return 1 print (AND(0, 0)) print (AND(1, 0)) print (AND(0, 1)) print (AND(1, 1)) | cs |
출력값
1 2 3 4 | 0 0 0 1 | cs |
같은 방법으로 NAND를 해볼까요?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #편향을 주지 않음 def NAND(x1, x2): w1, w2, theta = -0.5, -0.5, -0.7 tmp = x1*w1 + x2*w2 if tmp <= theta: return 0 elif tmp > theta: return 1 print (NAND(0, 0)) print (NAND(1, 0)) print (NAND(0, 1)) print (NAND(1, 1)) | cs |
출력값
1 2 3 4 | 1 1 1 0 | cs |
OR도 해봅시다.
1 2 3 4 5 6 7 8 9 10 11 12 13 | def OR(x1, x2): w1, w2, theta = 0.5, 0.5, 0.4 tmp = x1*w1 + x2*w2 if tmp <= theta: return 0 elif tmp > theta: return 1 print (OR(0, 0)) print (OR(1, 0)) print (OR(0, 1)) print (OR(1, 1)) | cs |
출력값
1 2 3 4 | 0 1 1 1 | cs |
XOR은 같은 방법으로는 나타낼 수 없습니다. 다음번에..
위와 같은 방법으로 나타내도 좋지만 편향을 도입해서 나타내는 방법도 있습니다.
편향이란 한쪽으로 치우친다는 의미로
식은 다음과 같습니다.
이 식은 사실 저번에 나온 식과 같습니다.
θ을 치환해주고 b라고 써줬을 뿐.. 따라서 b는 -θ 이겠죠?
어떤식으로 계산되는지 예를 들면
>>> import numpy as np
>>> x = np.array([0,1]) //입력값
>>> w = np.array([0.5,0.5]) //가중치
>>> b = -0.7 //편향 (임계값의 부호만 바꿈)
>>> w*x //입력값과 가중치를 곱하는 과정 0x0.5 그리고 1x0.5를 하게된다.
array([0. , 0.5]) //곱해서 나온값
>>> np.sum(w*x) //곱한 값들끼리 더한다.
0.5
>>> np.sum(w*x) + b //다시 편향을 더해준다
-0.19999999999999996 //약 -0.2가 나온다 0보다 작다.
이제 편향을 사용해서 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 |