제가 아직 배운게 단일 퍼셉트론이라 거기까지만 구현해봤어요.
우선 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])
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
인터넷 봤어요 구글