static void Real()
        {
            var inputLayer  = new InputLayer3D(1, 1, 1);
            var outputLayer = new OutputLayer(1)
            {
                ActivationFunction = new ConstOutputArrayFunction()
            };
            var dataProvider = new FunctionProvider();

            InitializeTrainingData(dataProvider.TrainData);
            var perceptron1 = new PerceptronLayer(10, 2)
            {
                ActivationFunction = new SigmoidFunction()
            };
            var perceptron2 = new PerceptronLayer(10, 10)
            {
                ActivationFunction = new SigmoidFunction()
            };
            var perceptron3 = new PerceptronLayer(8, 10)
            {
                ActivationFunction = new SigmoidFunction()
            };
            var perceptron4 = new PerceptronLayer(6, 8)
            {
                ActivationFunction = new SigmoidFunction()
            };
            var perceptron5 = new PerceptronLayer(2, 6)
            {
                ActivationFunction = new SigmoidFunction()
            };

            MultiLayerPerceptron network = new MultiLayerPerceptron
            {
                InputLayer   = inputLayer,
                OutputLayer  = outputLayer,
                DataProvider = dataProvider
            };

            network.HiddenLayers.Add(perceptron1);
            network.HiddenLayers.Add(perceptron2);
            network.HiddenLayers.Add(perceptron3);
            network.HiddenLayers.Add(perceptron4);
            network.HiddenLayers.Add(perceptron5);

            var trainer = new FCTrainer(network, 10, 1, dataProvider);

            trainer.Train(1);
            var error = network.Test(1);
        }
        static void OneTrainingData()
        {
            var inputLayer  = new InputLayer3D(1, 1, 3);
            var outputLayer = new OutputLayer(2)
            {
                ActivationFunction = new ConstOutputArrayFunction()
            };
            var weight1 = new List <Array3D> {
                new Array3D(0.1, 0.3), new Array3D(0.3, 0.1)
            };
            var weight2 = new List <Array3D> {
                new Array3D(0.4, 0.5), new Array3D(0.3, 0.5)
            };
            var perceptron1 = new PerceptronLayer(weight1)
            {
                ActivationFunction = new SigmoidFunction()
            };
            var perceptron2 = new PerceptronLayer(weight2)
            {
                ActivationFunction = new SigmoidFunction()
            };
            var dataProvider = new FunctionProvider
            {
                TrainData =
                {
                    new TrainingData <Array3D, Array3D> {
                        Input = new Array3D(0.3,                         0.4, 0.5), Expected = new Array3D(0.2, 0.6)
                    },
                    new TrainingData <Array3D, Array3D> {
                        Input = new Array3D(0.2, 0.4, 0.7), Expected = new Array3D(0.1, 0.8)
                    }
                }
            };

            var network = new MultiLayerPerceptron
            {
                InputLayer   = inputLayer,
                OutputLayer  = outputLayer,
                DataProvider = dataProvider
            };

            network.HiddenLayers.Add(perceptron1);
            network.HiddenLayers.Add(perceptron2);

            var trainer = new FCTrainer(network, 2, 1, dataProvider);

            trainer.Train(100);
        }
        static void Xor()
        {
            const int batchSize = 4;
            const int epochSize = 16;

            var inputLayer  = new InputLayer3D(1, 1, 1);
            var outputLayer = new OutputLayer(1)
            {
                ActivationFunction = new ConstOutputArrayFunction()
            };
            var dataProvider = new FunctionProvider
            {
                TrainData =
                {
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(0, 0), Expected = new Array3D(0.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(0, 1), Expected = new Array3D(1.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(1, 0), Expected = new Array3D(1.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(1, 1), Expected = new Array3D(0.0)
                    }
                },
                TestData = { new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(0, 0), Expected = new Array3D(0)
                             },
                             new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(0, 1), Expected = new Array3D(1)
                             },
                             new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(1, 0), Expected = new Array3D(1)
                             },
                             new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(1, 1), Expected = new Array3D(0)
                             } },
                IsQueue = false
            };
            var oneData = new FunctionProvider {
                TrainData =
                {
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(0, 0), Expected = new Array3D(0.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(1, 1), Expected = new Array3D(0.0)
                    }
                }, IsQueue = false
            };
            var function = new FunctionProvider(x => Math.Pow(x, 2));

            var weight1 = new List <Array3D> {
                new Array3D(0.1, 0.3), new Array3D(0.3, 0.1)
            };
            var weight2 = new List <Array3D> {
                new Array3D(0.4, 0.5)
            };
            var perceptron1 = new PerceptronLayer(5, 2)
            {
                ActivationFunction = new TanhActivationFunction()
            };

            perceptron1.Trainer = new MiniBatchPerceptronTrainer(perceptron1.Neurals, false)
            {
                BatchSize = batchSize, ActivationFunction = new TanhActivationFunction(), LearningRate = 0.1, Momentum = 0.1
            };
            var perceptron2 = new PerceptronLayer(1, 5)
            {
                ActivationFunction = new TanhActivationFunction()
            };

            perceptron2.Trainer = new MiniBatchPerceptronTrainer(perceptron2.Neurals, true)
            {
                BatchSize = batchSize, ActivationFunction = new TanhActivationFunction(), LearningRate = 0.1, Momentum = 0.1
            };

            var network = new MultiLayerPerceptron
            {
                InputLayer   = inputLayer,
                OutputLayer  = outputLayer,
                DataProvider = dataProvider
            };

            network.HiddenLayers.Add(perceptron1);
            network.HiddenLayers.Add(perceptron2);

            var trainer = new FCTrainer(network, epochSize, batchSize, dataProvider);

            trainer.Train(200);
        }
        public void TestNetwork()
        {
            const int layer0 = 3, layer1 = 2, layer2 = 3;

            #region 1 Iteration

            double[] input   = { 0.8, 0.76, 0.54 };
            double[] weight1 = { 0.35, 0.46, 0.51 };
            double[] weight2 = { 0.4, 0.87, 0.36 };

            double[] sum1 = { 0, 0 };

            for (var i = 0; i < input.Length; i++)
            {
                sum1[0] += input[i] * weight1[i];
                sum1[1] += input[i] * weight2[i];
            }

            double[] output1 = { Expanent(sum1[0]), Expanent(sum1[1]) };

            #endregion

            #region 2 Iteration

            double[] weight3 = { 0.5, 0.14 };
            double[] weight4 = { 0.76, 0.86 };
            double[] weight5 = { 0.95, 0.12 };

            double[] sum2 = { 0, 0, 0 };

            for (var i = 0; i < output1.Length; i++)
            {
                sum2[0] += output1[i] * weight3[i];
                sum2[1] += output1[i] * weight4[i];
                sum2[2] += output1[i] * weight5[i];
            }

            double[] output2 = { Expanent(sum2[0]), Expanent(sum2[1]), Expanent(sum2[2]) };

            #endregion

            #region Train

            double[] expected = { 0.87, 1, 0.32 };
            double[] error    = new double[layer2];
            for (var i = 0; i < error.Length; i++)
            {
                error[i] = output2[i] - expected[i];
            }

            double[] weightDelta = new double[layer2];
            for (var i = 0; i < layer2; i++)
            {
                weightDelta[i] = error[i] * output2[i] * (1 - output2[i]);
            }

            var newWeight3 = new double[layer1];
            var newWeight4 = new double[layer1];
            var newWeight5 = new double[layer1];

            const double learningRate = 0.1;
            for (var i = 0; i < layer1; i++)
            {
                newWeight3[i] = weight3[i] - output1[i] * weightDelta[0] * learningRate;
                newWeight4[i] = weight4[i] - output1[i] * weightDelta[1] * learningRate;
                newWeight5[i] = weight5[i] - output1[i] * weightDelta[2] * learningRate;
            }

            #region 2 Iteration

            double[] error2 = new double[layer1];
            for (var i = 0; i < layer1; i++)
            {
                error2[i] += weight3[i] * weightDelta[0];
                error2[i] += weight4[i] * weightDelta[1];
                error2[i] += weight5[i] * weightDelta[2];
            }

            double[] weightDelta2 = new double[layer1];
            for (var i = 0; i < layer1; i++)
            {
                weightDelta2[i] = error2[i] * output1[i] * (1 - output1[i]);
            }

            var newWeight1 = new double[layer0];
            var newWeight2 = new double[layer0];

            for (var i = 0; i < layer0; i++)
            {
                newWeight1[i] = weight1[i] - input[i] * weightDelta2[0] * learningRate;
                newWeight2[i] = weight2[i] - input[i] * weightDelta2[1] * learningRate;
            }


            #endregion

            #endregion

            #region Compare

            var inputLayer  = new InputLayer3D(1, 1, 3);
            var outputLayer = new OutputLayer(3)
            {
                ActivationFunction = new ConstArrayFunction()
            };

            var weightList1 = new List <List <double> > {
                new List <double>(weight1), new List <double>(weight2)
            };
            var hiddenLayer1 = new PerceptronLayer(weightList1);

            var weightList2 = new List <List <double> >
            {
                new List <double>(weight3),
                new List <double>(weight4),
                new List <double>(weight5)
            };
            var hiddenLayer2 = new PerceptronLayer(weightList2);

            var trainingData = new TrainingData <Array3D, Array3D>
            {
                Input    = new Array3D(input[0], input[1], input[2]),
                Expected = new Array3D(expected[0], expected[1], expected[2])
            };
            var trainingData2 = new TrainingData <Array3D, Array3D>
            {
                Input    = new Array3D(0.15, 0.44, 0.83),
                Expected = new Array3D(0.1, 0.24, 0.18)
            };

            var network = new MultiLayerPerceptron
            {
                InputLayer   = inputLayer,
                OutputLayer  = outputLayer,
                HiddenLayers = { hiddenLayer1, hiddenLayer2 },
                DataProvider = new FunctionProvider {
                    TrainData = { trainingData, trainingData2 }, IsQueue = true
                }
            };

            for (var i = 0; i < 3; i++)
            {
                Assert.AreEqual(network.HiddenLayers[0].Neurals[0].Weights[i], newWeight1[i], 0.001);
                Assert.AreEqual(network.HiddenLayers[0].Neurals[1].Weights[i], newWeight2[i], 0.001);
            }

            #endregion
        }
Example #5
0
        private void InitializeNetwork()
        {
            var inputLayer  = new InputLayer3D(1, 1, 1);
            var outputLayer = new OutputLayer(1)
            {
                ActivationFunction = new ConstOutputArrayFunction()
            };
            var dataProvider = new FunctionProvider
            {
                TrainData =
                {
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(0, 0), Expected = new Array3D(0.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(0, 1), Expected = new Array3D(1.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(1, 0), Expected = new Array3D(1.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(1, 1), Expected = new Array3D(0.0)
                    }
                },
                TestData = { new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(0, 0), Expected = new Array3D(0)
                             },
                             new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(0, 1), Expected = new Array3D(1)
                             },
                             new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(1, 0), Expected = new Array3D(1)
                             },
                             new TrainingData <Array3D, Array3D>
                             {
                                 Input = new Array3D(1, 1), Expected = new Array3D(0)
                             } },
                IsQueue = false
            };
            var oneData = new FunctionProvider
            {
                TrainData =
                {
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(0, 0), Expected = new Array3D(0.0)
                    },
                    new TrainingData <Array3D, Array3D>
                    {
                        Input = new Array3D(1, 1), Expected = new Array3D(0.0)
                    }
                },
                IsQueue = false
            };
            var function = new FunctionProvider(x => Math.Pow(x, 2));

            var perceptron1 = new PerceptronLayer(10, 1)
            {
                ActivationFunction = new TanhActivationFunction()
            };

            perceptron1.Trainer = new MiniBatchPerceptronTrainer(perceptron1.Neurals, false)
            {
                BatchSize = BatchSize, ActivationFunction = new TanhActivationFunction(), LearningRate = 0.1, Momentum = 0.1
            };
            var perceptron2 = new PerceptronLayer(1, 10)
            {
                ActivationFunction = new TanhActivationFunction()
            };

            perceptron2.Trainer = new MiniBatchPerceptronTrainer(perceptron2.Neurals, true)
            {
                BatchSize = BatchSize, ActivationFunction = new TanhActivationFunction(), LearningRate = 0.1, Momentum = 0.1
            };

            Network = new MultiLayerPerceptron
            {
                InputLayer   = inputLayer,
                OutputLayer  = outputLayer,
                DataProvider = function
            };
            Network.HiddenLayers.Add(perceptron1);
            Network.HiddenLayers.Add(perceptron2);

            Trainer = new FCTrainer(Network, EpochSize, BatchSize, function);
        }