Ejemplo n.º 1
0
        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
                }
            });
        }
Ejemplo n.º 2
0
        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]);
        }
Ejemplo n.º 3
0
        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
                }
            });
        }
Ejemplo n.º 4
0
        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}");
            });
        }