/* TEST NETWORK */ public double TestNetwork() { AverageError = 0; Console.WriteLine("Start testing"); for (int i = 0; i < NumberOfExamples; i++) { //Console.WriteLine("Input number {0}", i + 1); /* Add inputs to network and calculate outputs */ DigitNetwork.ResetAll(); DigitNetwork.SetInputValues(TestingData[i].ToArray <int>()); DigitNetwork.FeedResultsForward(); /* * Console.WriteLine("Network result: {0}; expected result: {1}", DigitNetwork.GetResult(), ExpectedResults[i]); * Console.WriteLine("Output neurons:"); * foreach (Neuron n in DigitNetwork.OutputLayer.Neurons) * Console.Write("{0} ", n.GetOutput()); * Console.WriteLine(); */ if (DigitNetwork.GetResult() == ExpectedResults[i]) { CountCorrect++; //Console.WriteLine("Correct identification, Correct = {0}", CountCorrect); } else { CountIncorrect++; //Console.WriteLine("Wrong identification, Wrong = {0}", CountIncorrect); } AverageError += DigitNetwork.GetResult() - ExpectedResults[i]; } AverageError /= NumberOfExamples; Console.WriteLine("Average error: {0}", AverageError); return(AverageError); }
/* TRAIN NETWORK */ public double TrainNetwork(int numOfEpochs = 10) { double averageError, globalAverageError = 0; int startingPoint; Console.WriteLine("Start training"); for (int epoch = 0; epoch < numOfEpochs; epoch++) { averageError = 0; startingPoint = new Random().Next(10); for (int i = startingPoint; i < NumerOfExamples; i += 10) { //Console.WriteLine("Input number {0}", i+1); /* Add inputs to network and calculate outputs */ DigitNetwork.ResetAll(); DigitNetwork.SetInputValues(TrainingData[i].ToArray <int>()); DigitNetwork.FeedResultsForward(); //Console.WriteLine("Network result: {0}; expected result: {1}", DigitNetwork.GetResult(), ExpectedResults[i]); if (DigitNetwork.GetResult() == ExpectedResults[i]) { CountCorrect++; //Console.WriteLine("Correct identification, Correct = {0}", CountCorrect); } else { CountIncorrect++; //Console.WriteLine("Wrong identification, Wrong = {0}", CountIncorrect); } averageError += DigitNetwork.GetResult() - ExpectedResults[i]; /* Calculate errors and propagate them back through the network, then adjust weights */ DigitNetwork.PropagateErrorsBack(LearningCoef, ExpectedResults[i]); /* * Console.WriteLine("Weights for the first hidden layer neurons:"); * foreach (Neuron neuron in ((SigmoidNeuronLayer)DigitNetwork.Layers[1]).Neurons) * { * Console.Write("{0}: ", ((SigmoidNeuron)neuron).ErrorCoef); * foreach (Node node in neuron.Inputs.Keys) * { * Console.Write(neuron.Inputs[node]); * Console.Write(" "); * } * Console.WriteLine(); * } * Console.WriteLine("Weights for the second hidden layer neurons:"); * foreach (Neuron neuron in ((SigmoidNeuronLayer)DigitNetwork.Layers[2]).Neurons) * { * Console.Write("{0}: ", ((SigmoidNeuron)neuron).ErrorCoef); * foreach (Node node in neuron.Inputs.Keys) * { * Console.Write(neuron.Inputs[node]); * Console.Write(" "); * } * Console.WriteLine(); * } * Console.WriteLine("Weights for the output neurons:"); * foreach (Neuron neuron in DigitNetwork.OutputLayer.Neurons) * { * Console.Write("{0}: ", ((SigmoidNeuron)neuron).ErrorCoef); * foreach (Node node in neuron.Inputs.Keys) * { * Console.Write(neuron.Inputs[node]); * Console.Write(" "); * } * Console.WriteLine(); * } * */ } averageError /= NumerOfExamples; //Console.WriteLine("Average error: {0}", averageError); globalAverageError += averageError; } globalAverageError /= numOfEpochs; Console.WriteLine("Global average error: {0}", globalAverageError); return(globalAverageError); }