![]() |
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 ![]() 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:
Wobei die Klasse TVector einfach zur besseren Handhabung einer TList da ist.
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; 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:
Weights[j] gibt hierbei das Gewicht zwischen dem aktuellem und dem vorherigen Neuron an.
//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]); Sobald die Fehler berechnet sind, soll das Netz lernen. Und zwar mit dieser Formel (Ich benutze die Batch Version):
Delphi-Quellcode:
Ich muss zugeben diese Codeschnipsel sehen jetzt etwas kommisch aus, aber deswegen werd ich das komplette Projekt extra noch Anhängen :)
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 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 04:51 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz