示例#1
0
        public void TestForward()
        {
            var parameterGenerator = new ActionParameterGenerator(() => 0.1, () => 1.0);
            var neuronFactor       = new NeuronFactory(parameterGenerator);
            var synapseFactory     = new SynapseFactory(parameterGenerator);
            var n = NetworkFactory.CreateMultilayerPerceptron(new[] { 2, 2, 1 }, ActivationFunction.Sigmoid,
                                                              ActivationFunction.Identity, null, neuronFactor, synapseFactory);
            var x = new Vector(3, 5);

            Assert.IsTrue(Math.Abs(n.Compute(x)[0] - 2.0993931) < 0.001);
        }
示例#2
0
        public void TestBack()
        {
            var parameterGenerator = new ActionParameterGenerator(() => 0.1, () => 1.0);
            var neuronFactor       = new NeuronFactory(parameterGenerator);
            var synapseFactory     = new SynapseFactory(parameterGenerator);
            var network            = NetworkFactory.CreateMultilayerPerceptron(new[] { 2, 2, 1, 1 }, ActivationFunction.Sigmoid,
                                                                               ActivationFunction.Identity, null, neuronFactor, synapseFactory);
            var networkTrainer = new NetworkTrainer(network);
            var x = new Vector(3, 5);

            network.Compute(x);
            networkTrainer.Back(42.0);

            var n = network.OutputLayer[0].Inputs[0].Source;

            Console.WriteLine(n.InputDerivative);
            Console.WriteLine(n.OutputDerivative);
            Console.WriteLine(n.InputDerivativeCount);

            Assert.IsTrue(Math.Abs(-3.987764 - n.InputDerivative) < 0.01);
            Assert.IsTrue(Math.Abs(-41.009155 - n.OutputDerivative) < 0.01);
            Assert.AreEqual(1, n.InputDerivativeCount);
        }
示例#3
0
        public void TestTrainXor()
        {
            var pg             = new PositiveUniformParameterGenerator();
            var neuronFactor   = new NeuronFactory(pg);
            var synapseFactory = new SynapseFactory(pg);
            var n = NetworkFactory.CreateMultilayerPerceptron(new[] { 2, 2, 1 }, ActivationFunction.Sigmoid,
                                                              ActivationFunction.Identity, null, neuronFactor, synapseFactory);
            var trainer = new NetworkTrainer(n, 0.9, 0.1);

            var examples = new Matrix(new double[, ] {
                { 0, 0 }, { 0, 1 }, { 1, 0 }, { 1, 1 }
            });
            var labels = new Vector(0, 1, 1, 0);

            trainer.Train(examples, labels, 1000);

            for (var i = 0; i < labels.Length; i++)
            {
                var x = examples.GetRow(i);
                var y = labels[i];
                Console.WriteLine("Actual: {0}, Result: {1}", y, n.Compute(x));
                Assert.IsTrue(Math.Abs(y - n.Compute(x)[0]) < 0.01);
            }
        }
示例#4
0
        /// <summary>
        ///   Create a multilayer perceptron
        /// </summary>
        /// <param name="layerSizes">Number of neurons per layer</param>
        /// <param name="activationFunction">Activation function for every hidden node</param>
        /// <param name="outputActivationFunction">Activation function for last layer</param>
        /// <param name="regularizationFunction">Regularization function</param>
        /// <param name="neuronFactory">Neuron factory used to create neurons</param>
        /// <param name="synapseFactory">Synapse factory used to create synapses</param>
        /// <returns>New network</returns>
        public static Network CreateMultilayerPerceptron(int[] layerSizes, IActivationFunction activationFunction,
                                                         IActivationFunction outputActivationFunction, IRegularizationFunction regularizationFunction,
                                                         NeuronFactory neuronFactory, SynapseFactory synapseFactory)
        {
            var prevLayer = new Neuron[layerSizes[0]];

            // create input layer
            var inputNeurons = new Neuron[layerSizes[0]];

            for (var i = 0; i < inputNeurons.Length; i++)
            {
                var n = neuronFactory.CreateNeuron(activationFunction);
                inputNeurons[i] = n;
                prevLayer[i]    = n;
            }

            // create hidden layers
            for (var i = 1; i < layerSizes.Length - 1; i++)
            {
                var layer = new Neuron[layerSizes[i]];

                for (var j = 0; j < layer.Length; j++)
                {
                    var n = neuronFactory.CreateNeuron(activationFunction);
                    layer[j] = n;

                    for (var k = 0; k < prevLayer.Length; k++)
                    {
                        var pn = prevLayer[k];
                        synapseFactory.Link(pn, n, regularizationFunction);
                    }
                }

                prevLayer = layer;
            }

            // create output layer
            var outputNeurons = new Neuron[layerSizes[layerSizes.Length - 1]];

            for (var i = 0; i < outputNeurons.Length; i++)
            {
                var outputNeuron = neuronFactory.CreateOutputNeuron(outputActivationFunction);
                outputNeurons[i] = outputNeuron;
                for (var j = 0; j < prevLayer.Length; j++)
                {
                    var pn = prevLayer[j];
                    synapseFactory.Link(pn, outputNeuron, regularizationFunction);
                }
            }

            return(new Network {
                InputLayer = inputNeurons, OutputLayer = outputNeurons
            });
        }
        static void Main(string[] args)
        {
            NeuralNetworkConfigurationSettings networkConfig = new NeuralNetworkConfigurationSettings
            {
                NumInputNeurons    = 1,
                NumOutputNeurons   = 1,
                NumHiddenLayers    = 2,
                NumHiddenNeurons   = 3,
                SummationFunction  = new SimpleSummation(),
                ActivationFunction = new TanhActivationFunction()
            };
            GenerationConfigurationSettings generationSettings = new GenerationConfigurationSettings
            {
                UseMultithreading    = true,
                GenerationPopulation = 500
            };
            EvolutionConfigurationSettings evolutionSettings = new EvolutionConfigurationSettings
            {
                NormalMutationRate  = 0.05,
                HighMutationRate    = 0.5,
                GenerationsPerEpoch = 10,
                NumEpochs           = 1000,
                NumTopEvalsToReport = 10
            };
            MutationConfigurationSettings mutationSettings = new MutationConfigurationSettings
            {
                MutateAxonActivationFunction       = true,
                MutateNumberOfHiddenLayers         = true,
                MutateNumberOfHiddenNeuronsInLayer = true,
                MutateSomaBiasFunction             = true,
                MutateSomaSummationFunction        = true,
                MutateSynapseWeights = true
            };
            var random = new RandomWeightInitializer(new Random());
            INeuralNetworkFactory factory          = NeuralNetworkFactory.GetInstance(SomaFactory.GetInstance(networkConfig.SummationFunction), AxonFactory.GetInstance(networkConfig.ActivationFunction), SynapseFactory.GetInstance(new RandomWeightInitializer(new Random()), AxonFactory.GetInstance(networkConfig.ActivationFunction)), SynapseFactory.GetInstance(new ConstantWeightInitializer(1.0), AxonFactory.GetInstance(new IdentityActivationFunction())), random);
            IBreeder            breeder            = BreederFactory.GetInstance(factory, random).Create();
            IMutator            mutator            = MutatorFactory.GetInstance(factory, random).Create(mutationSettings);
            IEvalWorkingSet     history            = EvalWorkingSetFactory.GetInstance().Create(50);
            IEvaluatableFactory evaluatableFactory = new GameEvaluationFactory();

            IStorageProxy proxy  = new NodeJSProxy(1, "http://localhost:3000", "123456789");
            IEpochAction  action = new BestPerformerUpdater(proxy);

            var GAFactory             = GeneticAlgorithmFactory.GetInstance(evaluatableFactory);
            IGeneticAlgorithm evolver = GAFactory.Create(networkConfig, generationSettings, evolutionSettings, factory, breeder, mutator, history, evaluatableFactory, action);

            evolver.RunSimulation();
        }