한동안 나를 우울하게 만들었던 인공신경망 퍼셉트론을 이용한 AND, OR 연산의 결과를 만들어내는 소스코드를 드디어 작성했다.



사실 나중에 다시 보면 내가 왜 이걸 짜면서 자괴감에 빠졌나 생각이 들면서 부끄러워 질지도 모르겠다. 하지만 이것 때문에 우울했던건 사실이고 난 해결을 했다는 사실이 기쁠 뿐 이다. 뭐든지 해낼 수 있을 것 같다.



식을 뜨문뜨문 보니 어려운 거였고, 식을 풀어서 쓰니 소스코드로 짜는게 굉장히 수월했다. 앞으론 지레 겁먹지 말고 차근차근 풀어나간 후 해결하려고 노력해야 겠다. 여하간 AND연산 OR연산을 도출할 수 있게 되었다. 단일 신경망이라 XOR연산은 도출할 수 없다.


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
def step(a) :
    if a>=0 :
        return 1
    else :
        return 0

Input = [[0,0],[0,1],[1,0],[1,1]]
Output = [0,0,0,0]
Result = [0,1,1,1] # OR Gate

Weight =[0.1,0.1]

SETA = 0.2
ALPHA = 0.1

Epoch = 1

while(1) :
    print("--------------------------- Epoch %d ---------------------------" % (Epoch))
    
    for p in range(4) :
        temp = 0
        for i in range(2) :
           temp += Input[p][i]*Weight[i]-SETA

        Output[p] = step(temp)

        nextWeight = [0.0,0.0]
        for i in range(2) :
            nextWeight[i] = Weight[i] + ALPHA * Input[p][i] * (Result[p]-Output[p])

        print("INPUT : %d %d, GOAL_OUTPUT : %d, FIRST_WEIGHT : %f %f, REAL_OUTPUT : %d, SUB : %d, LAST_WEIGHT : %f %f" % (Input[p][0], Input[p][1], Result[p], Weight[0], Weight[1], Output[p], Result[p]-Output[p], nextWeight[0], nextWeight[1]))
        Weight = nextWeight
        
    Epoch += 1


    if Output == Result :
        break

print("DONE!")

Result

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
--------------------------- Epoch 1 ---------------------------
INPUT : 0 0, GOAL_OUTPUT : 0, FIRST_WEIGHT : 0.100000 0.100000, REAL_OUTPUT : 0, SUB : 0, LAST_WEIGHT : 0.100000 0.100000
INPUT : 0 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.100000 0.100000, REAL_OUTPUT : 0, SUB : 1, LAST_WEIGHT : 0.100000 0.200000
INPUT : 1 0, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.100000 0.200000, REAL_OUTPUT : 0, SUB : 1, LAST_WEIGHT : 0.200000 0.200000
INPUT : 1 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.200000 0.200000, REAL_OUTPUT : 1, SUB : 0, LAST_WEIGHT : 0.200000 0.200000
--------------------------- Epoch 2 ---------------------------
INPUT : 0 0, GOAL_OUTPUT : 0, FIRST_WEIGHT : 0.200000 0.200000, REAL_OUTPUT : 0, SUB : 0, LAST_WEIGHT : 0.200000 0.200000
INPUT : 0 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.200000 0.200000, REAL_OUTPUT : 0, SUB : 1, LAST_WEIGHT : 0.200000 0.300000
INPUT : 1 0, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.200000 0.300000, REAL_OUTPUT : 0, SUB : 1, LAST_WEIGHT : 0.300000 0.300000
INPUT : 1 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.300000 0.300000, REAL_OUTPUT : 1, SUB : 0, LAST_WEIGHT : 0.300000 0.300000
--------------------------- Epoch 3 ---------------------------
INPUT : 0 0, GOAL_OUTPUT : 0, FIRST_WEIGHT : 0.300000 0.300000, REAL_OUTPUT : 0, SUB : 0, LAST_WEIGHT : 0.300000 0.300000
INPUT : 0 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.300000 0.300000, REAL_OUTPUT : 0, SUB : 1, LAST_WEIGHT : 0.300000 0.400000
INPUT : 1 0, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.300000 0.400000, REAL_OUTPUT : 0, SUB : 1, LAST_WEIGHT : 0.400000 0.400000
INPUT : 1 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.400000 0.400000, REAL_OUTPUT : 1, SUB : 0, LAST_WEIGHT : 0.400000 0.400000
--------------------------- Epoch 4 ---------------------------
INPUT : 0 0, GOAL_OUTPUT : 0, FIRST_WEIGHT : 0.400000 0.400000, REAL_OUTPUT : 0, SUB : 0, LAST_WEIGHT : 0.400000 0.400000
INPUT : 0 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.400000 0.400000, REAL_OUTPUT : 1, SUB : 0, LAST_WEIGHT : 0.400000 0.400000
INPUT : 1 0, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.400000 0.400000, REAL_OUTPUT : 1, SUB : 0, LAST_WEIGHT : 0.400000 0.400000
INPUT : 1 1, GOAL_OUTPUT : 1, FIRST_WEIGHT : 0.400000 0.400000, REAL_OUTPUT : 1, SUB : 0, LAST_WEIGHT : 0.400000 0.400000
DONE!
WRITTEN BY

배진오

하고싶은 건 다 하면서 사는게 목표
im@baejino.com

comments powered by Disqus