2013-04-12 5 views
0

Я изо всех сил пытаюсь реализовать однослойный персептрон: http://en.wikipedia.org/wiki/Perceptron. Моя программа, в зависимости от веса, либо теряется в цикле обучения, либо находит неправильные веса. В качестве тестового примера я использую логический И. Не могли бы вы объяснить, почему мой персептрон не сходится? Это для моего собственного обучения. Благодарю.Perceptron single layered

# learning rate 
rate = 0.1 

# Test data 
# logical AND 
# vector = (bias, coordinate1, coordinate2, targetedresult) 

testdata = [[1, 0, 0, 0], [1, 0, 1, 0], [1, 1, 0, 0], [1, 1, 1, 1]] 

# initial weigths 
import random 
w = [random.random(), random.random(), random.random()] 
print 'initial weigths = ', w 

def test(w, vector): 
    if diff(w, vector) <= 0.1: 
     return True 
    else: 
     return False 

def diff(w, vector): 
    from copy import deepcopy 
    we = deepcopy(w) 
    return dirac(sum(we[i]*vector[i] for i in range(3))) - vector[3] 

def improve(w, vector): 
    for i in range(3): 
     w[i] += rate*diff(w, vector)*vector[i] 
    return w 

def dirac(z): 
    if z > 0: 
     return 1 
    else: 
     return 0 

error = True 

while error == True: 
    discrepancy = 0 
    for x in testdata: 
     if not test(w, x): 
      w = improve(w, x) 
      discrepancy += 1 
    if discrepancy == 0: 
     print 'improved weigths = ', w 
     error = False 
+0

Возможно, используются заявления печати или отладчик? – Patashu

+1

Гораздо лучше вопрос. –

ответ

1

Похоже, вам нужен дополнительный цикл, окружающий ваш цикла для перебора улучшения, пока ваши решения не сходятся (шаг 3 на странице Википедии вы связаны).

Как сейчас, вы даете каждому учебному корпусу ровно один шанс обновить вес, так что у него нет шансов сходиться.

+0

Спасибо. Я должен переработать код. – JackAW

1
  1. Единственный сбой, который я вижу, находится в функции активации. Увеличьте значение обрезания, (z > 0.5).
  2. Кроме того, поскольку в каждую эпоху есть только 4 входных случая, очень сложно работать с 0 и 1 как единственный выход. Попробуйте удалить функцию дирака и увеличить порог до 0,2. Это может занять больше времени, но будет намного точнее. Конечно, в случае с NAND вам действительно не обязательно быть. Но это помогает в понимании.
+0

спасибо. Это было очень легко реализовать. Я начал думать, что, может быть, это потому, что я меняю вес после веса, но я должен менять их параллельно. Я буду играть с параметрами. – JackAW

 Смежные вопросы

  • Нет связанных вопросов^_^