Ich habe ein einfaches Künstliches Neuronales Netzwerk in Java als Teil eines Projekts geschrieben. Wenn ich mit dem Training der Daten beginne (unter Verwendung eines Trainingssatzes, den ich gesammelt habe), stabilisiert sich die Fehlerzahl in jeder Epoche schnell (auf ungefähr 30% Genauigkeit) und stoppt dann. Beim Testen des KNN sind alle Ausgänge für jeden gegebenen Eingang GENAU identisch.Neuronales Netzwerk liefert den gleichen Ausgang für jeden Eingang
Ich versuche, eine Zahl zwischen 0 und 1 Ausgang (0 eine Aktie als faller zu klassifizieren und 1 zu einer Riser zu klassifizieren - 0,4-0,6 sollte Stabilität zeigen)
Beim Hinzufügen der gleichen Trainingsdaten in Rapidminer Studios ein richtiger ANN mit viel größer (70 +%) Genauigkeit wird erstellt, daher weiß ich, dass der Datensatz in Ordnung ist. Es muss ein Problem in der ANN-Logik geben.
Unten ist der Code zum Ausführen und Anpassen der Gewichte. Irgendwelche Hilfe geschätzt!
public double[] Run(double[] inputs) {
//INPUTS
for (int i = 0; i < inputNeurons.length; i++) {
inputNeurons[i] = inputs[i];
}
for (int i = 0; i < hiddenNeurons.length; i++) {
hiddenNeurons[i] = 0;
} //RESET THE HIDDEN NEURONS
for (int e = 0; e < inputNeurons.length; e++) {
for (int i = 0; i < hiddenNeurons.length; i++) {
//Looping through each input neuron connected to each hidden neuron
hiddenNeurons[i] += inputNeurons[e] * inputWeights[(e * hiddenNeurons.length) + i];
//Summation (with the adding of neurons) - Done by taking the sum of each (input * connection weight)
//The more weighting a neuron has the more "important" it is in decision making
}
}
for (int j = 0; j < hiddenNeurons.length; j++) {
hiddenNeurons[j] = 1/(1 + Math.exp(-hiddenNeurons[j]));
//sigmoid function transforms the output into a real number between 0 and 1
}
//HIDDEN
for (int i = 0; i < outputNeurons.length; i++) {
outputNeurons[i] = 0;
} //RESET THE OUTPUT NEURONS
for (int e = 0; e < hiddenNeurons.length; e++) {
for (int i = 0; i < outputNeurons.length; i++) {
//Looping through each hidden neuron connected to each output neuron
outputNeurons[i] += hiddenNeurons[e] * hiddenWeights[(e * outputNeurons.length) + i];
//Summation (with the adding of neurons) as above
}
}
for (int j = 0; j < outputNeurons.length; j++) {
outputNeurons[j] = 1/(1 + Math.exp(-outputNeurons[j])); //sigmoid function as above
}
double[] outputs = new double[outputNeurons.length];
for (int j = 0; j < outputNeurons.length; j++) {
//Places all output neuron values into an array
outputs[j] = outputNeurons[j];
}
return outputs;
}
public double[] CalculateErrors(double[] targetValues) {
//Compares the given values to the actual values
for (int k = 0; k < outputErrors.length; k++) {
outputErrors[k] = targetValues[k] - outputNeurons[k];
}
return outputErrors;
}
public void tuneWeights() //Back Propagation
{
// Start from the end - From output to hidden
for (int p = 0; p < this.hiddenNeurons.length; p++) //For all Hidden Neurons
{
for (int q = 0; q < this.outputNeurons.length; q++) //For all Output Neurons
{
double delta = this.outputNeurons[q] * (1 - this.outputNeurons[q]) * this.outputErrors[q];
//DELTA is the error for the output neuron q
this.hiddenWeights[(p * outputNeurons.length) + q] += this.learningRate * delta * this.hiddenNeurons[p];
/*Adjust the particular weight relative to the error
*If the error is large, the weighting will be decreased
*If the error is small, the weighting will be increased
*/
}
}
// From hidden to inps -- Same as above
for (int i = 0; i < this.inputNeurons.length; i++) //For all Input Neurons
{
for (int j = 0; j < this.hiddenNeurons.length; j++) //For all Hidden Neurons
{
double delta = this.hiddenNeurons[j] * (1 - this.hiddenNeurons[j]);
double x = 0; //We do not have output errors here so we must use extra data from Output Neurons
for (int k = 0; k < this.outputNeurons.length; k++) {
double outputDelta = this.outputNeurons[k] * (1 - this.outputNeurons[k]) * this.outputErrors[k];
//We calculate the output delta again
x = x + outputDelta * this.hiddenWeights[(j * outputNeurons.length) + k];
//We then calculate the error based on the hidden weights (x is used to add the error values of all weights)
delta = delta * x;
}
this.inputWeights[(i * hiddenNeurons.length) + j] += this.learningRate * delta * this.inputNeurons[i];
//Adjust weight like above
}
}
}
Wie initialisieren Sie Gewichte? Sind sie nicht alle 0 am Anfang? –
Versucht, dass mit den gleichen Ergebnissen, im Moment sie zufällig zwischen -1 und 1 –
initialisiert werden. Beacuse, wenn Sie sie alle mit 0s initialisieren, können Sie einen solchen Effekt erhalten (dass Ihr Netzwerk einfach in dieser Konfiguration stecken bleibt). Funktioniert es jetzt (nach zufälliger Initialisierung)? –