Hi,
dies ist mein erster Post hier in diesem Forum und ich habe sofort ein einigermaßen "exotisches" Problem. Auf
dieser Internet-Seite habe ich eine kleine Einführung in den Aufbau und die Funktionsweise von neuronalen Netzen gefunden. Habe in Delphi sowohl das abgebildete Forwardpropagation- als auch das Backpropagation-Netz programmiert. Ersteres hat funktioniert, aber beim Backpropagation-Netz haperts. Da der Autor für den ersten Lernvorgang mit Input 1 0 die Veränderungen der Neuronen-Outputs und Änderungen in den Gewichtunen angegeben hat, konnte ich dies nachprüfen. Für den ersten Durchlauf des Inputs 1 0 erzielt mein Programm auch genau die angegebenen Änderungen. Nur wenn ich das Netz abwechselnd mit den Inputs 1 0 und 1 1 trainiere, dann strebt der Output für beide Inputs auf 0 zu.
(Nur mit 1 0 trainieren klappt auch nicht, strebt auf 0,5 zu)
Quelltext auszugsweise mit Kommentaren:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| lernrate := 0.25; i1_i := strtofloat(Edit1.Text); ----------------- Eingang des 1. Neurons im input layer i2_i := strtofloat(Edit2.Text); ----------------- Eingang des 2. Neurons im input layer i1_o := i1_i; ----------------------------------- output = input i2_o := i2_i; ----------------------------------- output = input h1_i := i1_o * w1 + i2_o * w3 + bias * wb1; ----- Berechnung des inputs hidden layer1 h2_i := i1_o * w2 + i2_o * w4 + bias * wb2; ----- Berechnung des inputs hidden layer2 h1_o := 1/(1+exp(-h1_i)); ----------------------- sigmoid activation h2_o := 1/(1+exp(-h2_i)); ----------------------- sigmoid activation o1_i := h1_o * w5 + h2_o * w6; ------------------ input des output layer neurons o1_o := 1/(1+exp(-o1_i)); ----------------------- output des output layer neurons gewuenscht := strtofloat(Edit6.Text); ----------- gewünschter output fehler := gewuenscht - o1_o; -------------------- Fehler des outputs c5 := lernrate * fehler * h1_o * (-fehler) * (1+fehler); Änderung Gewichtung h1 -> o c6 := lernrate * fehler * h2_o * (-fehler) * (1+fehler); Änderung Gewichtung h2 -> o cb3:= lernrate * fehler * bias * (-fehler) * (1+fehler); Änderung Gewichtung Bias -> o w5 := w5 + c5; ---------------------------------- Gewichtung h1 -> o ändern w6 := w6 + c6; ---------------------------------- Gewichtung h2 -> o ändern wb3:= wb3 + cb3; -------------------------------- Gewichtung Bias -> o ändern c1 := lernrate * fehler * i1_o * h1_o * (1-h1_o); Änderung Gewichtung i1 -> h1 c2 := lernrate * fehler * i1_o * h2_o * (1-h2_o); Änderung Gewichtung i1 -> h2 c3 := lernrate * fehler * i2_o * h1_o * (1-h1_o); Änderung Gewichtung i2 -> h1 c4 := lernrate * fehler * i2_o * h2_o * (1-h2_o); Änderung Gewichtung i2 -> h2 cb1 := lernrate * fehler * bias * h1_o * (1-h1_o);Änderung Gewichtung Bias -> h1 cb2 := lernrate * fehler * bias * h2_o * (1-h2_o);Änderung Gewichtung Bias -> h2 w1 := w1 + c1; ---------------------------------- Gewichtung i1 -> h1 ändern w2 := w2 + c2; ---------------------------------- Gewichtung i1 -> h2 ändern w3 := w3 + c3; ---------------------------------- Gewichtung i2 -> h1 ändern w4 := w4 + c4; ---------------------------------- Gewichtung i2 -> h2 ändern wb1 := wb1 + cb1; ---------------------------------- Gewichtung Bias -> h1 ändern wb2 := wb2 + cb2; ---------------------------------- Gewichtung Bias -> h2 ändern |
Ich weiß, dass der Code ziemlich dahingeschludert ist, aber da er ja für den ersten Durchgang funktioniert, finde ich den Fehler nicht, der anscheinend später auftritt.
Vielleicht findet sich ja hier jemand, der sich ein wenig mit neuronalen Netzen auskennt.
Vielen Dank schonmal,
Peter