Einzelnen Beitrag anzeigen

Maximus

Registriert seit: 26. Okt 2003
169 Beiträge
 
#1

Backpropagation-Netz - Fehler- & Lernfunktion

  Alt 5. Nov 2005, 15:09
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
Angehängte Dateien
Dateityp: zip nnsimulation_163.zip (256,6 KB, 26x aufgerufen)
  Mit Zitat antworten Zitat