Autor |
Beitrag |
RUNNER
Hält's aus hier
Beiträge: 3
|
Verfasst: Di 19.07.05 21:53
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
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.07.05 13:34
 hier im Forum.
Das muss ich zu Hause mal ausprobieren. So nur durch Ansehen wird das nix.
Allerdings habe ich den Eindruck, dass es eventuell gar nicht an dem angegebenen Quelltext liegt. Denn das Problem macht für mich Sinn, wenn einfach irgendwo noch ein Wert vom alten Training da ist und dann für das neue Training mit benutzt wird.
Schließlich basieren ja neuronale Netze darauf, dass der kleinste Fehler gesucht wird (wir haben zum Beispiel den Gradientenabstieg benutzt). Und wenn man andere Zwischenwerte hat findet man eventuell nicht dasselbe Minimum. Und das neue Minimum kann dann schlechter sein.
|
|
RUNNER 
Hält's aus hier
Beiträge: 3
|
Verfasst: Mi 20.07.05 19:13
Hi,
leider ist diese Internet-Seite eine der wenigen die ich gefunden habe, die nicht nur mathematische Formeln aufzählt, sondern anhand eines praktischen Beispiels die Funktionsweise zeigt. Da die Seite Teil der Diplomarbeit des Autors ist, gehe ich von der Richtigkeit der Beispiele aus. Ich habe heute mal das Netz in Excel nachgebaut und durch Probieren Gewichtungen gefunden, bei denen das Netz eine Fehlerrate hatte, die mit 20 Nachkommastellen nicht mehr angezeigt werden konnte.
Daher denke ich, dass irgendwas mit meinem Backpropagation-Berechnungen nicht stimmt, obwohl der erste Durchgang mit 1 0 wie gesagt funktioniert.
Falls es weiterhilft, kann ich dir das gesamte Projekt zusenden. Bin ja schon froh, dass überhaupt jemand geantwortet hat. Habe auch den Autor angeschrieben, aber da die Seite schon fast 10 Jahre alt ist, weiss ich nicht ob ich von ihm eine Antwort bekomme.
Gruß,
Peter
|
|
sango
      
Beiträge: 236
WinXP Home
Delphi 2005 Pro
|
Verfasst: Mi 20.07.05 19:43
_________________ Never read the Off-Topic
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 21.07.05 11:23
Das gesamte Projekt wäre vielleicht sinnvoll, dann könnte ich das mal mit meinem eigenen in C geschriebenen Programm vergleichen (eine einfache Spracherkennung, bisher allerdings nur für Vokale).
Denn da sollte ja beim Vergleich herauskommen, WO die Werte falsch werden, sofern ich die Netze kompatibel bekomme, aber das sollte kein Problem sein.
Einfach direkt ins Forum als Attachment oder per Mail an projects@jaenicke.wir-berlin.de...
|
|
Jürgen70
Hält's aus hier
Beiträge: 1
|
Verfasst: Do 21.07.05 12:32
Hi Runner,
ich bin selbst auf der suche nach einer Implementierung eines neuronalen Netzes. Vielleicht hilft Dir der Download unten auf dieser Seite weiter:
www.informatik.htw-d...iwe/Belege/Raaymann/
|
|
RUNNER 
Hält's aus hier
Beiträge: 3
|
Verfasst: Do 21.07.05 18:55
Hi,
@ jaenicke: Hab dir das Projekt als eMail geschickt.
@ Jürgen70: Vielen Dank für den Link, da könnte ich mir ein eigenes Programm ja eigentlich sparen, aber wo bleibt dann der Spass...
Gruß,
Peter
|
|
|