public void Compute_3Layers() { var net = NeuralNetBuilder.From(new NeuralNetConfig() { HiddenLayerCount = 3, HiddenLayerNeuronCount = 2, InputLabels = new string[] { "A" }, OutputLabels = new string[] { "1" } }); net.InitializeWeights(new double[2 + 2 + 4 + 4] { 1, 1, // input weights .5, 1, // neruon 1 to 3 and 4 1, 1, // neruon 2 to 3 and 4 1, 1, 1, 1, 1, 1 // output weights }); var output = net.Compute(new NamedValue[] { new NamedValue() { Name = "A", Value = 1 } }); }
public void CorrectWeightCount() { var net = NeuralNetBuilder.From(new NeuralNetConfig() { HiddenLayerCount = 1, HiddenLayerNeuronCount = 1, InputLabels = new string[] { "A" }, OutputLabels = new string[] { "1" } }); net.InitializeWeights(new double[2]); net = NeuralNetBuilder.From(new NeuralNetConfig() { HiddenLayerCount = 1, HiddenLayerNeuronCount = 2, InputLabels = new string[] { "A" }, OutputLabels = new string[] { "1" } }); net.InitializeWeights(new double[2 + 2]); net = NeuralNetBuilder.From(new NeuralNetConfig() { HiddenLayerCount = 2, HiddenLayerNeuronCount = 2, InputLabels = new string[] { "A" }, OutputLabels = new string[] { "1" } }); net.InitializeWeights(new double[2 + 2 + 4]); net = NeuralNetBuilder.From(new NeuralNetConfig() { HiddenLayerCount = 3, HiddenLayerNeuronCount = 2, InputLabels = new string[] { "A" }, OutputLabels = new string[] { "1" } }); net.InitializeWeights(new double[2 + 2 + 4 + 4]); }
public void Compute() { var net = NeuralNetBuilder.From(new NeuralNetConfig() { HiddenLayerCount = 1, HiddenLayerNeuronCount = 1, InputLabels = new string[] { "A" }, OutputLabels = new string[] { "1", "2", "3" } }); net.InitializeWeights(new double[1 + 3] { .5, .5, .25, 1 }); var output = net.Compute(new NamedValue[] { new NamedValue() { Name = "A", Value = 1 } }); }
public void Sin() { var rand = new Random(); var net = NeuralNetBuilder.From(new NeuralNetConfig() { InputLabels = new string[] { "x" }, OutputLabels = new string[] { "y" }, HiddenLayerCount = 3, HiddenLayerNeuronCount = 3, //PreActivationFunction = (i, d) => ActivationFunction = d => d > .5 ? 1 : 0 //ActivationFunction = d => 1 / (1 + Math.Pow(Math.E, -d)) }); var trainingData = new List <Tuple <double, double> >(); for (double i = 0; i < Math.PI * 2; i += .1) { var input = i; var output = Math.Sin(i); //var normalizedOutput = output / Math.PI * 2; var normalizedOutput = .5 * (output + 1); var normalizedInput = input / (Math.PI * 2); trainingData.Add(new Tuple <double, double>(normalizedInput, normalizedOutput)); } var weightCount = net.WeightCount; var biasCount = net.BiasCount; var weightOrgSpawner = new SpawnFunction <double[]>(index => { var data = new double[weightCount + biasCount]; for (int i = 0; i < weightCount + biasCount; i++) { var scale = i >= weightCount ? 1 : 1; data[i] = (rand.NextDouble()) * scale; } return(new Org(data)); }); var fitnessFunction = new FitnessFunction <double[]>(org => { net.InitializeWeights(org.Genome.Take(weightCount).ToArray()); net.InitializeBiases(org.Genome.Skip(weightCount).ToArray()); var errorSum = trainingData.Select(trainingElement => { var input = trainingElement.Item1; var expectedOutput = trainingElement.Item2; var actualOutput = net.Compute(new NamedValue[] { new NamedValue() { Name = "x", Value = input } }); var error = expectedOutput - actualOutput[0].Value; var convertedError = Math.Pow((Math.Abs(error) + 1), 2); return(convertedError); }).Sum(); //Trace.WriteLine(errorSum); return(1 / errorSum); }); var geneticSim = new GeneticSimulation <double[]>(fitnessFunction, weightOrgSpawner, 50); var bestSet = geneticSim.Evolve(20000, false); var theBest = geneticSim.GetBest(); net.InitializeWeights(theBest.Genome.Take(weightCount).ToArray()); net.InitializeBiases(theBest.Genome.Skip(weightCount).ToArray()); Trace.WriteLine("OUTPUT"); trainingData.ForEach(t => { var input = t.Item1; var expectedOutput = t.Item2; var actualOutput = net.Compute(new NamedValue[] { new NamedValue() { Name = "x", Value = input } }); var error = expectedOutput - actualOutput[0].Value; //Trace.WriteLine($"INPUT:{input} EXPECT:{expectedOutput} REAL:{actualOutput[0].Value} ERR:{error}"); //Trace.WriteLine($"{input},{expectedOutput},{actualOutput[0].Value}"); Trace.WriteLine($"{actualOutput[0].Value}"); }); }