Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Backpropagation-Netz - Fehler- & Lernfunktion (https://www.delphipraxis.net/56434-backpropagation-netz-fehler-lernfunktion.html)

Maximus 5. Nov 2005 15:09


Backpropagation-Netz - Fehler- & Lernfunktion
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo liebe DP'ler

Nachdem nun die Schulferien vorbei sind, konnt ich mein Projekt fertigstellen ein einfaches feedforward Backpropagation-Netz. Doch irgendwie lernt das Netz absolut nur Müll. Die Vermutung liegt jetzt nahe das irgendwas mit meiner Fehler- oder Lernfunktion nicht stimmt (diese zwei Punkte habe ich auch nicht 100% Verstanden). Jedoch nach mehrmaligen (ja so ca. 200 mal) durchlesen von diversen Seiten weiß ich einfach nicht weiter.

Das meiste hab ich von Uni Münster. Und so wie ich das dort aufgefasst habe müsste das Netz funktioniere ....

Erstmal ein paar Daten zum Netz:

Zuerst wird beim Training aus dem Eingabevektor ein Ausgabevektor berechnet, dannach wird der quadratische Fehler der Ausgabe bestimmt. Dies erledigt folgende Funktion für mich:

Delphi-Quellcode:
function TNeuralNet.CalculateNetError(AExpOutput, ARealOutput: TVector) : Double;
var i: Integer; // ExpOutput --> Expected Output ... RealOutput --> berechneter "wirklicher" Output
begin
 For i := 0 to FNumOutputs -1 do
  Result := Result + ((AExpOutput[i] - ARealOutput[i]) *  (AExpOutput[i] - ARealOutput[i]));
 Result := 0.5 * Result;
end;
Wobei die Klasse TVector einfach zur besseren Handhabung einer TList da ist.

Sobald der Fehler einen bestimmten Wert überschreitet muss das Netz trainiert werden. Um das Netz zu trainieren brauch ich allerdings einen Fehler für jedes Neuron. Diesen berechne ich so (Ich schreib hier mal nur die Formel hin, da die Procedure etwas länger ist):

Delphi-Quellcode:
 //Für jedes Neuron der Ausgabeschicht
 Error := ExpOutput[i] - RealOutput[i];

 //Für jedes Neuron in den Hidden layers
 ANeuron.Error := ANeuron.Error + (Sigmoid(ANeuron.Output)) * (1- Sigmoid(ANeuron.Output) * (ATempNeuron.Error * ATempNeuron.Weights[j]);
Weights[j] gibt hierbei das Gewicht zwischen dem aktuellem und dem vorherigen Neuron an.

Sobald die Fehler berechnet sind, soll das Netz lernen. Und zwar mit dieser Formel (Ich benutze die Batch Version):

Delphi-Quellcode:
 If FCount = FBatchsize then
 begin
   ANeuron.Gradient[k] := ANeuron.Gradient[k] + ANeuron.Error * ATempNeuron.Output;
   ANeuron.Weights[k] := ANeuron.Weights[k] - (FLearningRate / FBatchsize) * ANeuron.Gradient[k];
 end
 Else
   ANeuron.Gradient[k] := ANeuron.Gradient[k] + ANeuron.Error * ATempNeuron.Output;
 end;
Ich muss zugeben diese Codeschnipsel sehen jetzt etwas kommisch aus, aber deswegen werd ich das komplette Projekt extra noch Anhängen :)

Ich wende mich mit dem Problem an die DP, weil ich hier schon einige Threads über das Thema gesehen habe, indem auch schon die ein oder anderen geschrieben haben sie würden sich mit soetwas beschäftigen.

Ich hoffe ihr könnt mir weiterhelfen! - Und wenn ich irgendwas vergessen habe hier zu erklären anzuführendas für eine Problemlösung relevant wäre mich bitte darauf aufmerksam zu machen!

MFG
Maximus


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:18 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz