반응형

이전 포스팅에서 논리 회로 중 AND 게이트와 퍼셉트론(Perceptron)을 활용하는 방법에 대해 쉽게 설명했다.

아래 포스팅을 참조하면 된다.

2024.12.10 - [인공지능(AI)/딥러닝(DeepLearning)] - [딥러닝]인공지능 초보 개발자면 퍼셉트론과 AND 게이트 활용 방법은 알고 가자, 쉬운 설명.

 

[딥러닝]인공지능 초보 개발자면 퍼셉트론과 AND 게이트 활용 방법은 알고 가자, 쉬운 설명.

음식도 맛있고 양도 많은데 가격까지 저렴하다면 우리는 가성비가 좋다고 표현한다.음식과 가격 둘 다 만족해야 가성비라는 표현을 쓴다.이 중 하나라도 맘에 안들면 가성비가 좋다고 하지 않

tiboy.tistory.com

딥러닝을 공부하는 개발자라면 논리 연산이 AND 외 더 있다는 것을 알고 있다.

NAND, OR 그리고 XOR 게이트가 더 있다.

XOR 게이트는 인공지능에 한 걸음 더 나가가는 특별한 경우라 따로 설명하겠다.

 

AND 게이트와 퍼셉트론 활용에 이어 이번 포스팅은 NAND 게이트와 OR 게이트에 대해 쉽게 설명해 본다.

AI 개발자가 되기 위해  출발해 봅시다.

준비되었나요?

 

NAND 게이트와 퍼셉트론 활용

NAND는 무슨 의미일까?

낸드라고 읽는데 어디서 들어본 듯하다.

"낸드"로 검색하면 반도체 관련 뉴스를 볼 수 있다. 

그 뉴스에서 "낸드플래시"라는 용어를 많이 볼 수 있는데 그 낸드가 NAND다.

NAND는 "Not AND"다.

"Not"이 붙은 의미는 반대라고 생각하자.

AND 게이트의 값을 반대로 출력한다. 

AND 게이트 진리표를 표로 다시 확인해 보자.

x1 x2 y
0 0 0
1 0 0
0 1 0
1 1 1

NAND 게이트는 출력값이 반대로 나온다고 했다.

이제 NAND 게이트 진리표를 표로 정리해 보자.

x1 x2 y
0 0 1
1 0 1
0 1 1
1 1 0

x1과 x2가 하나 이상 0일 때 AND 게이트는 0이었지만 NAND는 1이다.

x1과 x2가 모두 1일 때 AND 게이트는 1이었지만 NAND는 0이다.

이제 가중치와 임계값을 정해보자.

(w1, w2, 𝞱)0 : x1w1 + x2w2 <= 𝞱 1: x1w1 + x2w2 > 𝞱

AND 게이트와 퍼셉트론에서 봤던 계산식과 기호들이다.

기억을 되살려보자.

w1 = 0.7, w2 = 0.3, 𝞱 = 0.9

AND 게이트의 x1, x2 값 (0, 0)인 경우부터 순서대로 식에 대입해 보자.

0 * 0.7 + 0 * 0.3 = 0 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 0 * 0.3 = 0.7 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

0 * 0.7 + 1 * 0.3 = 0.3 은 0.9보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 1 * 0.3 = 1.0 은 0.9보다 크므로 (>) 1.

위 가중치와 임계값은 AND 게이트용이다.

NAND 출력값은 AND의 반대라고 했다.

위 가중치와 임계값에 마이너스 부호를 붙이면 NAND 게이트를 만족한다.

w1 = -0.7, w2 = -0.3, 𝞱 = -0.9

0 * -0.7 + 0 * -0.3 = 0 은 -0.9 보다 크므로 (>) 1.

1 * -0.7 + 0 * -0.3 = -0.7 은 -0.9 보다 크므로 (>) 1.

0 * -0.7 + 1 * -0.3 = -0.3 은 -0.9 보다 크므로 (>) 1.

1 * -0.7 + 1 * -0.3 = -1.0 은 -0.9보다 작거나 같은 조건이므로 (<=) 0.

 

OR 게이트와 퍼셉트론 활용

이제 OR 게이트도 같은 방식으로 알아보자.

우리말로 "또는, 둘 중 하나"로 해석하면 된다.

둘 중 하나 이상이 true(1) 면 1을 출력한다.

OR 게이트 진리표를 표로 정리해 보자.

x1 x2 y
0 0 0
1 0 1
0 1 1
1 1 1

x1과 x2가 둘 중 1개 이상 1일 때 OR는 1이다.

x1과 x2가 모두 0일 때 OR는 0이다.

OR 게이트 입력 매개변수는 다음처럼 설정하면 된다.

w1 = 0.7, w2 = 0.3, 𝞱 = 0.2 는 OR 게이트용 가중치와 임계값이다.

위 가중치와 임계값은 OR 게이트를 만족한다.

0 * 0.7 + 0 * 0.3 = 0 은 0.2 보다 작거나 같은 조건이므로 (<=) 0.

1 * 0.7 + 0 * 0.3 = 0.7 은 0.2 보다 크므로 (>) 1.

0 * 0.7 + 1 * 0.3 = 0.3 은 0.2  보다 크므로 (>) 1.

1 * 0.7 + 1 * 0.3 = 1.0 0.2  보다 크므로 (>) 1.

가중치와 임계값을 조정할 수 있다는 것을 알았다.

 

논리 회로, 퍼셉트론 활용을 파이썬으로 구현하는 방법

이론 이야기를 했으니 파이썬을 사용해서 직접 코딩해 보자.

아나콘다(파이썬)가 설치된 VSCode(Visual Studio Code)를 사용했다.

 

AND 게이트 함수 만들기

아래 코드를 살펴보자.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
 
def AndGate(x1, x2):
    xn = np.array([x1, x2])
    wn = np.array([0.70.3])
    theta = 0.9
 
    sumData = np.sum(wn*xn)
    if sumData <= theta:
        return 0
    else:
        return 1
    
 
 
print(AndGate(0,0))
print(AndGate(1,0))
print(AndGate(0,1))
print(AndGate(1,1))
cs

1번 라인은 numpy를 import 했다.

numpy 내부 함수 array와 sum을 사용할 것이다.

3번 라인에서 AndGate 함수를 선언했다. x1과 x2를 입력받는다.

4번 라인은 x1, x2를 numpy 내부 array함수에 세팅한다.

5번 라인은 w1, w2 값인 0.7, 0.3을 마찬가지로 내부 array 함수에 세팅한다.

6번은 theta( 𝞱)값을 0.9로 할당했다.

8번 라인은 4, 5번 라인 array 값들의 합을 sum 함수로 계산하고 sumData에 할당한다.

9번~ 12번은 sumData 값이 theta값보다 작거나 같으면(<=) 0 아니면 1을 출력한다.

16번부터 AND 게이트 입력값을 넣으면 같은 결과가 나온다.

결과 ( 0, 0, 0, 1)

NAND 게이트 함수 만들기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import numpy as np
 
def NAND_GATE(x1, x2):
    w1, w2, theta = -0.7-0.3-0.9
    sumData = w1*x1 + w2*x2
    
    if sumData <= theta:
        return 0
    elif sumData > theta:
        return 1
    
 
 
print(NAND_GATE(0,0))
print(NAND_GATE(1,0))
print(NAND_GATE(0,1))
print(NAND_GATE(1,1))
cs

4번 라인에 NAND 게이트 가중치와 임계값을 세팅했다.

결과는 (1, 1, 1, 0)로 NAND 게이트와 일치한다.

 

OR 게이트 함수 만들기.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import numpy as np
 
def OrGate(x1, x2):
    xn = np.array([x1, x2])
    wn = np.array([0.70.3])
    theta = 0.2
 
    sumData = np.sum(wn*xn)
    if sumData <= theta:
        return 0
    else:
        return 1
    
 
 
print(OrGate(0,0))
print(OrGate(1,0))
print(OrGate(0,1))
print(OrGate(1,1))
cs

이번 포스팅의 마지막 소스 OR 게이트 구현이다.

OR 게이트 구현을 위해 theta( 𝞱)값에 0.2를 할당했다.

결과는 (0, 1, 1, 1)이다.

 

지금까지 NAND와 OR 게이트를 퍼셉트론에 활용하는 내용을 알아봤다.

해당 부분을 파이썬 코드로 구현도 했다.

딥러닝 다음 편은 XOR 게이트에 대해 알아본다.

XOR 게이트는 약간 다르다.

AI 개발자로 한걸음 더 다가섰다.

끝.

반응형
반응형

안녕하세요. 신기한 연구소입니다.

카테고리를 보면 Software>Python(파이썬)에 파이썬 프로그래밍 포스팅을 예전에 올렸는데 갑자기 왜 파이썬일까요?

2020.09.28 - [Software/Python(파이썬)] - 파이썬(Python) 처음 시작하기 앞서...

 

파이썬(Python) 처음 시작하기 앞서...

안녕하세요. 신기한 연구소입니다. 파이썬(Python)이 존재하고 유명하다는 건 오래전 알았지만 최근까지 자바(Java)로 개발을 해 왔기에 접할 기회가 없었습니다. 공부하기 위해 책도 몇 권 사뒀지

tiboy.tistory.com

 

20년 9월 28일부터 시작해서 25개의 글을 포스팅했었네요.

20년 도면 시간이 정말 많아서 아마 집중해서 스터디하고 포스팅했던 기억이 있습니다.

대학 시절부터 Lisp 강의를 듣고 인공지능에 대한 환상 같은 것이 있었는데 21년도에 우연히 딥러닝 책을 보게 되었고 인공지능의 재미에 슬슬 빠져들기 시작했습니다.

수학 내용이 포함되어 있지만 나름 대학에서 미적분학 A+였던지라 재미있게 읽게 되었습니다.

20년이 훌쩍 지났지만 아직은 수학에 즐거움이 있고 인공지능이 점점 발전하고 필요성을 느끼고 있기에 나이를 떠나 올해는 인공지능에 올인해 볼 계획을 세웠습니다.

그전에 인공지능을 스터디하려면 머신러닝과 딥러닝을 스터디해야 하는데 보통 파이썬(python)으로 프로그래밍하거나 관련 라이브러리가 있기에 다시 복습하는 의미로 간단하게 인공지능을 위한 파이썬(python)을 정리하고자 이 포스팅을 시작해 봅니다.

내년에는 나름 인공지능 전문가가 되길 희망하면서 올해 열심히 달려보겠습니다.

아래 테스트 소스는 VSCode에서 파이썬을 설치 후 실행한 결과입니다.

 

1. 파이썬 숫자(Number)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
print(1+2)
print(10-5)
print(4*5)
print(8/2)
print(8%5)
print(8//5)
print(8/5)
print(4+4*4)
print((4+4)*4)
print(2**4)
 
first = 5
second = 10
print(first + second)
 
print(2+3j)
cs

1번 라인은 단순한 연산입니다. 1+2는 3이므로 3이 출력됩니다.

2번 라인은 빼기 연산입니다. 5가 출력됩니다.

3번 라인은 곱하기 연산입니다. 20이 출력됩니다.

4번 라인은 나누기입니다.  4.0이 출력됩니다.

5번 라인은 나머지를 구합니다. 3이 출력됩니다.

6번 라인은 몫을 구합니다. 1이 출력됩니다.

7번 라인은 소수점을 출력합니다. 1.6이 출력됩니다.

8번 라인은 연산자 우선순위로 4*4를 먼저 계산하고 4를 더합니다. 20이 출력됩니다.

9번 라인은 괄호를 먼저 계산합니다. 32가 출력됩니다.

10번 라인은 거듭제곱으로 2의 4제곱으로 16이 출력됩니다.

12, 13라인은 변수에 숫자 5, 10을 할당했습니다.

14번 라인은 두 변수를 더합니다. 15가 출력됩니다.

16번 라인은 복소수를 나타내며 2+3j가 출력됩니다. j가 복소수를 의미합니다.

 

2. 파이썬 문자(Text)

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
32
33
34
35
36
37
38
39
print('my text')
print("don't")
print('don\'t')
 
print('D:\myproj\node')
print(r'D:\myproj\node')
 
print("""
      my name
      is
      tiboy
      """)
 
print('hi' * 3 + ' jenny')
print('hi' ' jenny')
 
data = ('Hello my friends.'
        ' Goodbye buddy')
print(data)
 
name = 'Tom'
 
print('hi~!' + name)
 
longText = "abcdefghijklmn"
 
print(longText[0])
print(longText[-1])
print(longText[0:2])
print(longText[1:2])
print(longText[1:])
print(longText[:2])
print(longText[0:50])
print(longText[40:50])
 
#longText[0] = 'A'
print(longText[0])
 
print(len(longText))
cs

1번 라인은 my text가 출력됩니다.

2번 라인은 don't가 출력됩니다.

3번 라인은 \를 사용해서 ' ' 내부에 '를 출력하게 했습니다. don't가 출력됩니다.

5번 라인은 D:\myproj이 첫 줄에 출력되고 \n때문에 다음줄에 ode가 출력됩니다.

6번 라인은 텍스트 앞에 r을 붙여서 \n의 기능이 작동되지 않게 해서 D:\myproj\node로 출력됩니다.

8번~12번 라인은 더블 세 개 """를 이용해서 줄 바꿈 그대로 출력하게 할 수 있습니다.

14번 라인은 hi*3으로 hi가 세 번 출력되고 jenny가 그 뒤로 붙습니다.  hihihi jenny

15번 라인은 hi jenny가 출력됩니다.

17번~19번 라인은 data에 텍스트를 할당하고 Hello my friends. Goodbye buddy로 출력됩니다.

21번 라인은 name에 Tom을 할당했습니다.

23번 라인은 hi~!에 Tom을 붙여 출력합니다.

25번 라인은 longText에 abcdefghijklmn을 할당합니다.

27번 라인은 0번째 글자 a가 출력됩니다.

28번 라인은 -1번째로 뒤에서 첫 번째 글자 n이 출력됩니다.

29번 라인은 [0:2]로 인덱스 값이기에 첫 글자 0부터 3번째 2 이전까지를 출력합니다. ab가 출력됩니다.

30번 라인은 [1:2]로 두 번째 값 b만 출력됩니다.

31번 라인은 [1:]로 1 이후로 쭉 출력합니다. a가 빠진 bcdefghijklmn이 출력됩니다.

32번 라인은 [:2]로 3번째 앞까지 출력하기에 ab가 출력합니다.

33번 라인은 [0:50]인데 50까지 없기에 abcdefghijklmn가 출력됩니다.

34번 라인은 [40:50]으로 해당 문자열이 존재하지 않기에 빈값이 출력됩니다.

36번 라인은 #으로 주석처리를 한 이유는 문자열을 [] 사용해서 변경할 수 없습니다. 재할당을 해야 합니다.

39번 라인은 len을 사용해서 문자열 길이를 출력합니다. 14가 출력됩니다.

 

3. 파이썬 리스트(List) 

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
32
33
34
35
36
37
38
39
40
41
42
num = [2,4,6,8]
print(num)
 
print(num[0+ num[1])
print(num[-2])
print(num[-3:])
print(num[:-3])
print(num[:])
 
num = num + [10]
 
print(num)
 
num = num + [1215]
 
print(num)
 
print(num[6])
num[6=14
 
print(num[6])
 
num.append(16)
print(num)
 
text = ['a','b','c','d','e']
print(text)
text[2:4= ['C''D']
print(text)
 
text[2:4= []
print(text)
 
text[:] = []
print(text)
 
db1 = ['a','b','c']
db2 = ['d','e']
db3 = [db1, db2]
 
print(db3)
print(db3[1][1])
cs

리스트는 대괄호 사이에 쉼표로 값을 구분합니다.

다른 타입의 값들을 가질 수 있습니다.

1번 라인은 num 변수에 값을 할당해서 리스트를 만들었습니다.

2번 라인은 [2, 4, 6, 8]을 출력합니다.

4번 라인은 0번째와 1번째 인덱스에 해당하는 값을 더해서 6을 출력합니다.

5번 라인은 인덱스 -2로 리스트 뒤에서 2번째 값인 6을 출력합니다.

6번 라인은 [-3:]로 뒤에서 세 번째 인덱스 값부터 출력하기에 [4, 6, 8]이 출력됩니다.

7번 라인은 [:-3]으로 처음부터 뒤에서 세번째 인덱스까지 출력하기에 [2]가 출력됩니다.

8번 라인은 [:]로 모두 출력합니다. [2, 4, 6, 8]

10번 라인은 num 리스트에 [10]을 더합니다.

12번 라인은 [10]을 더한 [2, 4, 6, 8, 10]을 출력합니다.

14번 라인은 num 리스트에 [12, 15]를 더합니다.

16번 라인은 [12, 15]를 더한 [2, 4, 6, 8, 10, 12, 15]가 출력됩니다.

18번 라인은 6번째 인덱스 값인 15를 출력합니다.

19번 라인은 num 리스트의 6번째 인덱스에 14를 재할당 합니다.

21번 라인은 이제 6번째 인덱스의 값이 15가 아닌 14로 바뀌어 출력됩니다.

 23번 라인은 num 리스트에 append 함수를 사용해서 16을 추가했습니다.

24번 라인은 [2, 4, 6, 8, 10, 12, 14, 16]를 출력합니다.

26번 라인은 text 변수에 문자 값으로 리스트를 만들었습니다.

27번 라인은 ['a', 'b', 'c', 'd', 'e']를 출력합니다.

28번 라인은 [2:4]에 'C', 'D'로 재할당했습니다.

29번 라인은 ['a', 'b', 'C', 'D', 'e']로 재할당 값으로 바뀌어 출력되었습니다.

31번 라인은 [2:4]에 []로 빈 값을 할당했습니다.

32번 라인은 [2:4] 값이 빠진 ['a', 'b', 'e']이 출력되었습니다.

34번 라인은 []으로 전체 값을 비웠습니다.

35번 라인은 []을 출력합니다.

37번~38번 라인에 db1, db2 리스트가 할당되었습니다.

39번 라인은 db3에 db1, db2값이 할당되었습니다.

41번 라인은 db3에 db1, db2가 할당된 값이 출력됩니다. [['a', 'b', 'c'], ['d', 'e']]

42번 라인은 [1][1]로 마치 2중 배열 출력을 연상케 합니다. e가 출력됩니다.

 

이번 포스팅은 숫자, 문자, 리스트를 다루는 방법을 아주 간단하게 복습해 봤습니다.

다음 포스팅은 파이썬 연산자를 복습해 보겠습니다.

즐코딩 하세요.

미래의 인공지능 전문가 신기한 연구소였습니다.

 

 

반응형