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