3

j'essaye d'implémenter le perceptron multicouche avec la rétropropagation, mais je ne peux toujours pas lui enseigner XOR, j'obtiendrai également souvent l'erreur de gamme de maths. J'ai regardé dans les livres et Google pour les règles d'apprentissage et d'erreurs de retour des méthodes de propagation, mais je ne sais pas où sont mes erreurspython - perceptron multicouche, backpropagation, ne peut apprendre 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 

Répondre

2

La seule chose que je remarque est que vous la mise à jour weights_h1 et weights_h2 avec error_out au lieu de error_h1 et error_h2. En d'autres termes:

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

oui, c'est ça. Merci beaucoup – user2173836

0

L'erreur de gamme de mathématiques vient probablement du calcul Math.exp (-net), pour un grand nombre net négatif.

Questions connexes