Exemple #1
0
 /// <summary>
 /// Creates an instance of Layer with the specified number of neurons with
 /// specified neuron properties
 /// </summary>
 /// <param name="neuronsCount"> number of neurons in layer </param>
 /// <param name="neuronProperties"> properties of neurons in layer </param>
 public Layer(int neuronsCount, NeuronProperties neuronProperties) : this(neuronsCount) {
     for (int i = 0; i < neuronsCount; i++)
     {
         Neuron neuron = NeuronFactory.createNeuron(neuronProperties);
         this.addNeuron(neuron);
     }
 }
Exemple #2
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
            });
        }
Exemple #3
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);
        }
Exemple #4
0
        static void Main(string[] args)
        {
            var trainDataDirectory = @"D:\Files\Apps\OCR.Server\Resources\TrainData\Samples";
            var weightDirectory    = @"D:\Files\Apps\OCR.Server\Resources\TrainData\Weights";

            var factory = new NeuronFactory();
            var service = new NeuronService(weightDirectory, factory);

            var recongizeService = new NeuronRecognizeService();

            var converter        = new RecognitionDataConverter();
            var trainDataService = new TrainDataService(trainDataDirectory, converter);

            var neuronA = service.Get('A');


            foreach (var trainData in trainDataService.Get('A'))
            {
                Recognize(trainData, neuronA);
            }

            void Recognize(int[,] trainData, Neuron neuron)
            {
                if (recongizeService.IsRecognized(trainData, neuron))
                {
                    Console.WriteLine($"Easy! It's [{neuron.Symbol}]. Isn't it? [y/n]: ");
                    if (Console.ReadLine() != "y")
                    {
                        recongizeService.Forget(trainData, neuron);
                        Recognize(trainData, neuron);
                    }

                    return;
                }

                Console.WriteLine($"Hm... cannot figure out [{neuron.Symbol}]. Lern {neuron.Symbol}? [y/n]");
                if (Console.ReadLine() == "y")
                {
                    recongizeService.Learn(trainData, neuron);
                    Recognize(trainData, neuron);
                }
            }
        }
Exemple #5
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);
        }
Exemple #6
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);
            }
        }