제가 아직 배운게 단일 퍼셉트론이라 거기까지만 구현해봤어요.


우선 neuron객체를 하나 생성해야 합니다.


neuron = neuron([0,0])


뉴런 객체를 만들때는 인자로 인풋들의 리스트를 넘겨줘야 해요. 저는 편의상 and연산을 가르치기 위해 두개만 넘기겠습니다.


그리고 나선 간단합니다.


neuron.learn([[0,0],[0,1],[1,0],[1,1]],[0,0,0,1])


이러면 학습이 됩니다. 이게 좀 리스트들이 겹치고 겹치니까 복잡해 보이는데, 하나하나 살펴보면 정말 별거 없이 쉽습니다.


learn(인풋 리스트, 목표치 리스트, 민감도)


이게 인자의 전부입니다. 굉장히 쉽죠? 위의 예제에서 저는 [0,0]을 넣었을 경우 0을, [0,1]을 넣었을 경우 0을, [1,0]을 넣었을 경우 0을, [1,1]을 넣었을 경우 1을 반환하도록 뉴런을 학습시킨겁니다. input[i]와 goal[i]가 대응되는 형태입니다.


민감도는 한번에 뉴런의 가중치를 얼만큼씩 바꿀지에 대한 수치입니다. 적정 수치는 네이버에 찾아봐야 할거 같습니다. 저도 잘 몰라요. 0.1정도면 문제가 없더라구요. 그래서 기본값이 0.1이므로 생략하신다면 민감도는 0.1로 자동 설정됩니다.


자 이제 뉴런을 학습시켜 봅시다. 3000번 가르쳐보죠.


for i in range(3000):

    neuron.learn([[0,0],[0,1],[1,0],[1,1]],[0,0,0,1])


3000번 and연산을 가르쳤습니다. 확인해볼까요?


neuron.print_neuron([0,0])

neuron.print_neuron([0,1])

neuron.print_neuron([1,0])

neuron.print_neuron([1,1])


이렇게 네개의 인풋을 전달해서 아웃풋을 확인해 봅시다.

0,0,0,1이 나왔나요? 그럼 and연산을 배운 뉴런 객체 neuron이 탄생했습니다!






import random

def sigmoid(x):

    e = 2.718281828459045

    y = 1.0/(1+e**(-1*x))

    return y


class neuron:

    def __init__(self,input_list):

        input_list.append(1)

        weight_list = []

        result = 0

        for i in input_list:

            weight_list.append(random.choice([-1,1])*random.random())

        self.input_list = input_list

        self.weight_list = weight_list



    def calculate(self):

        result = 0

        for i in range(len(self.weight_list)):

            result += self.weight_list[i]*self.input_list[i]

        self.output = sigmoid(result)

    def modify(self,goal,a=0.1):

        self.calculate()

        error = self.output - goal

        for i in range(len(self.input_list)):

            self.weight_list[i]-=a*self.input_list[i]*error

    def change(self,input_list):

        input_list.append(1)

        self.input_list = input_list

    def learn(self,inputs,goals,a=0.1):

        for i in range(len(inputs)):

            self.change(inputs[i])

            self.modify(goals[i],a)

    def print_neuron(self,input_list):

        self.change(input_list)

        self.calculate()

        return self.output