static void Main(string[] args) { var neuralNetwork = new NeuralNetwork(3, 1, 3, 1, 1); neuralNetwork.Backpropagate(LearningInputs, LearningOutputs, 100000, 0.00001); Console.WriteLine("Enter values to test the neural network. Enter the values and operation value separated by space."); Console.WriteLine("Operation values: AND - -1, OR - 0, XOR - 1"); while (true) { var input = Console.ReadLine().Split(' ').Select(Double.Parse).ToList(); neuralNetwork.ProcessInputs(input); var outputs = neuralNetwork.GetOutputs(); Console.WriteLine(String.Join(" ", outputs.ToArray())); } }
static void Main(string[] args) { // create a network NeuralNetwork _network = new NeuralNetwork(2, 2, 5, 1); Program program = new Program(); // dataset // a set for learning the logical AND gate DataSet trainingData = new DataSet(); trainingData.Inputs.Add(new List <double> { 0, 0 }); trainingData.Outputs.Add(new List <double> { 0 }); trainingData.Inputs.Add(new List <double> { 0, 1 }); trainingData.Outputs.Add(new List <double> { 0 }); trainingData.Inputs.Add(new List <double> { 1, 0 }); trainingData.Outputs.Add(new List <double> { 0 }); trainingData.Inputs.Add(new List <double> { 1, 1 }); trainingData.Outputs.Add(new List <double> { 1 }); // train for (int i = 0; i < 100000; i++) { double og_error = 0.0; double test_error = 0.0; // calculate current network error for (int j = 0; j < trainingData.Inputs.Count; j++) { _network.SetInputs(trainingData.Inputs[j]); _network.ForwardPropagate(); List <double> Outputs = _network.GetOutputs(); for (int k = 0; k < Outputs.Count; k++) { og_error += Math.Pow(trainingData.Outputs[j][k] - Outputs[k], 2); // squared error cost function } } // create a new network based off of the last one with gaussian distribution NeuralNetwork _testNetwork = new NeuralNetwork(_network); // change hidden layer Weights and biases foreach (Layer layer in _testNetwork.HiddenLayers) { foreach (Neuron neuron in layer.Neurons) { for (int j = 0; j < neuron.Weights.Count; j++) { neuron.Weights[j] += program.NextGaussian(0, 0.025); } neuron.Bias += program.NextGaussian(0, 0.05); } } // change output layer Weights and biases foreach (Neuron neuron in _testNetwork.OutputLayer.Neurons) { for (int j = 0; j < neuron.Weights.Count; j++) { neuron.Weights[j] += program.NextGaussian(0, 0.5); } neuron.Bias += program.NextGaussian(0, 0.5); } // calculate test network error for (int j = 0; j < trainingData.Inputs.Count; j++) { _testNetwork.SetInputs(trainingData.Inputs[j]); _testNetwork.ForwardPropagate(); List <double> Outputs = _testNetwork.GetOutputs(); for (int k = 0; k < Outputs.Count; k++) { test_error += Math.Pow(trainingData.Outputs[j][k] - Outputs[k], 2); // squared error cost function } } // if test has less error then replace the network Console.SetCursorPosition(0, 0); Console.WriteLine("og_error: " + og_error); Console.WriteLine("test_error: " + test_error); if (test_error < og_error) { Console.WriteLine("updated"); _network = _testNetwork; } else { Console.WriteLine("not updated"); } } // test the network while (true) { List <double> test_inputs = new List <double>(); for (int i = 0; i < _network.InputLayer.Width; i++) { Console.WriteLine("input" + i + ": "); double one = Convert.ToDouble(Console.ReadLine()); test_inputs.Add(one); } _network.SetInputs(test_inputs); _network.ForwardPropagate(); foreach (double x in _network.GetOutputs()) { Console.WriteLine("output: " + x); } } }