Я создаю простой персептрон с 3 входами (x, y, смещение = 1).
Он должен угадать, находится ли заданная точка (x,y) под или под заданной функцией.
По сути, он был вдохновлен этой статьей.
Для обучения сети используется контролируемая модель обучения, и формула следующая:
learningConst = 0.01
error = desired - neuralAnswer
new_weights[i] = old_weights[i] + error * inputs[i] * learningConst
Тем не менее, после 100000 обучающих тестов он делает ошибки даже на простой функции (2x+1)
Вот код:
import numpy as np
import matplotlib.pyplot as plt
class Perceptron:
def __init__(self, n):
self.n = n #n is 2 in this case. 2 inputs [ x, y ]
self.weights = [np.random.uniform(-1, 1) for x in range(n)]
self.learningConstant = 0.05
# 1 added to the sum is the bias input
def feedForward(self, inputs):
return 1 + sum([self.weights[i]*inputs[i] for i in range(self.n)])
def activate(self, result):
if result >= 0:
return 1
elif result < 0:
return -1
def train(self, inputs, expected):
prediction = self.feedForward(inputs)
answer = self.activate(prediction)
error = expected - answer
self.weights = [
self.weights[i] + error * inputs[i] * self.learningConstant
for i in range(self.n)
]
#print(self.weights)
def predict(self, inputs):
prediction = self.feedForward(inputs)
return self.activate(prediction)
Вы можете увидеть здесь результаты. Зеленый цвет указывает на то, что персептрон угадал правильно, а красный цвет указывает на ошибки. Забавно - он имеет тенденцию ошибаться в точках ниже линии.
Что мне сделать, чтобы улучшить программу?
ПОЛНЫЙ КОД: НАЖМИТЕ
РЕШЕНИЕ
Моя проблема заключалась в том, что ввод смещения использовался как грубая константа (строка 14 полного кода), не позволяя алгоритму учиться на нем. Итак, мои входные данные теперь равны [смещение, x, y], а веса равны [w1, w3, w3] — вход смещения теперь имеет свой вес.
Еще одна хорошая идея — сохранить веса в другом месте, чтобы алгоритму не приходилось начинать заново каждый раз, когда вы тестируете программу.
numpy
только для создания случайных чисел... используйте массивы numpy и векторные операции:self.weigths = np.random.uniform(-1, 1, size=n)
, а такжеnp.sum(self.weigths * inputs)
иself.weights = self.weights + error*inputs*self.learningConstant
. - person Bakuriu   schedule 14.05.2016Perceptron
, чтобы мне не пришлось его придумывать :) - person bakkal   schedule 14.05.2016