Autor Beitrag
RUNNER
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:
ausblenden volle Höhe Delphi-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.07.05 13:34 
:welcome: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic starofftopic star
Beiträge: 236

WinXP Home
Delphi 2005 Pro
BeitragVerfasst: Mi 20.07.05 19:43 
user profile iconRUNNER hat folgendes geschrieben:

Bin ja schon froh, dass überhaupt jemand geantwortet hat.

Nicht das du vom DF enttäuscht bist, hier wird dir schon normalerweise schneller und umfangreicher geholfen, aber ich glaube dein problem ist (zumindest bei mir) :eyes: :gruebel: :nixweiss: :nut: weit über dem was man eben so mal kurz durchdenken kann. nicht umsonst ist das teil einer diplomarbeit.
bin fasziniert von dem thema, und auch von dem gezeigten applet, nur darauf zu antworten trau ich mich nicht. bzw. was dazu zu sagen. Das ist wie bei einer wunderhübschen schönen frau, die traut sich auch kaum einer anzusprechen :roll:

also nicht verzagen DF weiterfragen :)

_________________
Never read the Off-Topic
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19312
Erhaltene Danke: 1747

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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



BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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