Python 단층 퍼셉트론(AND, OR) 프로그래밍

baealex

소비적인 일보단 생산적인 일을 좋아합니다.

Sign in to view email

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



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



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


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

--------------------------- 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!
작성된 댓글이 없습니다!
로그인된 사용자만 댓글을 작성할 수 있습니다.