3

Я пытаюсь реализовать многослойный персептрон с backpropagagation, но все же я не могу научить его XOR, я также часто получаю ошибку математического диапазона. Я посмотрел в книгах и Google для правил обучения и ошибок назад методы распространения, но все же я понятия не имею, где мои ошибкиpython - многослойный персептрон, backpropagation, can't learn XOR

def logsig(net): 
    return 1/(1+math.exp(-net)) 

def perceptron(coef = 0.5, iterations = 10000): 
    inputs = [[0,0],[0,1],[1,0],[1,1]] 
    desiredOuts = [0,1,1,0] 
    bias = -1 
    [input.append(bias) for input in inputs] 
    weights_h1 = [random.random() for e in range(len(inputs[0]))] 
    weights_h2 = [random.random() for e in range(len(inputs[0]))] 
    weights_out = [random.random() for e in range(3)] 
    for itteration in range(iterations): 
     out = [] 
     for input, desiredOut in zip(inputs, desiredOuts): 
       #1st hiden neuron 
      net_h1 = sum(x * w for x, w in zip(input, weights_h1)) 
      aktivation_h1 = logsig(net_h1) 
       #2st hiden neuron 
      net_h2 = sum(x * w for x, w in zip(input, weights_h2)) 
      aktivation_h2 = logsig(net_h2) 
       #output neuron 
      input_out = [aktivation_h1, aktivation_h2, bias] 
      net_out = sum(x * w for x, w in zip(input_out, weights_out)) 
      aktivation_out = logsig(net_out)    
       #error propagation   
      error_out = (desiredOut - aktivation_out) * aktivation_out * (1- aktivation_out) 
      error_h1 = aktivation_h1 * (1-aktivation_h1) * weights_out[0] * error_out 
      error_h2 = aktivation_h2 * (1-aktivation_h2) * weights_out[1] * error_out 
       #learning    
      weights_out = [w + x * coef * error_out for w, x in zip(weights_out, input_out)] 
      weights_h1 = [w + x * coef * error_out for w, x in zip(weights_h1, input)] 
      weights_h2 = [w + x * coef * error_out for w, x in zip(weights_h2, input)]    
      out.append(aktivation_out) 
    formatedOutput = ["%.2f" % e for e in out] 
    return formatedOutput 

ответ

2

Единственное, что я замечаю, что вы обновляете weights_h1 и weights_h2 с error_out вместо error_h1 и error_h2. Другими словами: Ошибка диапазона

weights_h1 = [w + x * coef * error_h1 for w, x in zip(weights_h1, input)] 
weights_h2 = [w + x * coef * error_h2 for w, x in zip(weights_h2, input)] 
+0

да, все. большое спасибо – user2173836

0

Математика, скорее всего, идет от Math.exp расчета (-сетью), для чистой большого отрицательного числа.

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