private static void train(int ep) { // the input values double[,] inputs = { { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 } }; // desired results double[] results = { 0, 1, 1, 0 }; // creating the neurons Neuron hiddenNeuron1 = new Neuron(); Neuron hiddenNeuron2 = new Neuron(); Neuron hiddenNeuron3 = new Neuron(); OutputNeuron outputNeuron = new OutputNeuron(); // random weights hiddenNeuron1.randomizeWeights(); hiddenNeuron2.randomizeWeights(); hiddenNeuron3.randomizeWeights(); outputNeuron.randomizeWeights(); int epoch = 0; Retry: epoch++; for (int i = 0; i < 4; i++) // very important, do NOT train for only one example { // 1) forward propagation (calculates output) hiddenNeuron1.inputs = new double[] { inputs[i, 0], inputs[i, 1] }; hiddenNeuron2.inputs = new double[] { inputs[i, 0], inputs[i, 1] }; outputNeuron.inputs = new double[] { hiddenNeuron1.output, hiddenNeuron2.output }; Console.WriteLine("{0} xor {1} = {2}", inputs[i, 0], inputs[i, 1], outputNeuron.output()); Console.WriteLine(outputNeuron.output()[0]); Console.WriteLine(outputNeuron.output()[1]); Console.WriteLine(outputNeuron.output()[2]); // 2) back propagation (adjusts weights) // adjusts the weight of the output neuron, based on its error outputNeuron.error = sigmoid.derivative(outputNeuron.output) * (results[i] - outputNeuron.output); //get { return sigmoid.output(weights[0] * inputs[0] + weights[1] * inputs[1] + biasWeight); } outputNeuron.adjustWeights(); // then adjusts the hidden neurons' weights, based on their errors hiddenNeuron1.error = sigmoid.derivative(hiddenNeuron1.output) * outputNeuron.error * outputNeuron.weights[0]; hiddenNeuron2.error = sigmoid.derivative(hiddenNeuron2.output) * outputNeuron.error * outputNeuron.weights[1]; hiddenNeuron1.adjustWeights(); hiddenNeuron2.adjustWeights(); } if (epoch < ep) { goto Retry; } OutPutNeuron1 = outputNeuron; HiddenNeuron1 = hiddenNeuron1; HiddenNeuron2 = hiddenNeuron2; Console.ReadLine(); }