Esempio n. 1
0
        public void Train(double[] inputArray, double[] targetArray)
        {
            //Matrix.Matrix inputMatrix = new Matrix.Matrix(inputArray);
            FillHiddenNeurons(inputArray);
            //hiddenOutput.DisplayMatrix();

            Matrix.Matrix outputsOutput = outputWeights * hiddenOutput;
            if (useBias)
            {
                outputsOutput += biasOutput;
            }
            Matrix.Matrix targetMatrix       = new Matrix.Matrix(targetArray);
            Matrix.Matrix outputErrorsMatrix = targetMatrix - outputsOutput;

            // mapMatrixLinearry(outputsOutput);   //!!! do zmiany w wariancie 2 na normalne mapowanie

            Matrix.Matrix gradients_output = outputErrorsMatrix * learningRate;

            //gradients_output.HadamardProduct(outputsOutput);
            //gradients_output.DisplayMatrix();
            Matrix.Matrix hiddenTransposed = hiddenOutput.TransposeMatrix();
            //hiddenTransposed.DisplayMatrix();
            Matrix.Matrix outputs_deltas = gradients_output * hiddenTransposed;
            //outputs_deltas.DisplayMatrix();

            outputWeights += outputs_deltas;
            biasOutput    += gradients_output;

            outputWeights += momentumMatrixOutput;
            biasOutput    += momentumMatrixOutputBias;

            momentumMatrixOutput     = outputs_deltas * momentumRate;
            momentumMatrixOutputBias = gradients_output * momentumRate;
        }
Esempio n. 2
0
        public void Train(double[] inputArray, double[] targetArray)
        {
            /*Random rnd = new Random();
             * for (int i = 0; i < 10; ++i)
             * {
             *  //wypełnianie macierzy c - centrów
             *  int index = rnd.Next(0, inp.row);
             *  for (int j = 0; j < 1; ++j)
             *  {
             *      centre.tab[i, j] = inp.tab[index, j];
             *  }
             *  //wypełnianie macierzy r - zasięgu
             *  range.tab[i, 0] = rnd.NextDouble() * 50;
             * }*/


            //Matrix.Matrix inputMatrix = new Matrix.Matrix(inputArray);
            FillHiddenNeurons(inputArray);
            //hiddenOutput.DisplayMatrix();

            Matrix.Matrix outputsOutput = outputWeights * hiddenOutput;

            Matrix.Matrix targetMatrix       = new Matrix.Matrix(targetArray);
            Matrix.Matrix outputErrorsMatrix = targetMatrix - outputsOutput;

            mapMatrixLinearry(outputsOutput);   //!!! do zmiany w wariancie 2 na normalne mapowanie

            Matrix.Matrix gradients_output = outputErrorsMatrix * learningRate;

            gradients_output.HadamardProduct(outputsOutput);
            //gradients_output.DisplayMatrix();
            Matrix.Matrix hiddenTransposed = hiddenOutput.TransposeMatrix();
            //hiddenTransposed.DisplayMatrix();
            Matrix.Matrix outputs_deltas = gradients_output * hiddenTransposed;
            //outputs_deltas.DisplayMatrix();

            outputWeights += outputs_deltas;
            //Console.WriteLine("outputWeights: ");
            //outputWeights.DisplayMatrix();
        }
Esempio n. 3
0
        public void train(double[] inputArray, double[] targetArray)
        {
            Matrix.Matrix inputMatrix  = new Matrix.Matrix(inputArray);   // 3 x 1
            Matrix.Matrix hiddenOutput = hiddenWeights * inputMatrix;
            if (useBias)
            {
                hiddenOutput += biasHidden;
            }
            activationFunction(hiddenOutput);

            //showHiddenOutputs(hiddenOutput);

            Matrix.Matrix outputsOutput = outputWeights * hiddenOutput;
            if (useBias)
            {
                outputsOutput += biasOutput;
            }
            activationFunction(outputsOutput);

            Matrix.Matrix targetMatrix       = new Matrix.Matrix(targetArray);
            Matrix.Matrix outputErrorsMatrix = targetMatrix - outputsOutput;

            mapMatrix(outputsOutput);

            Matrix.Matrix gradients_output = outputErrorsMatrix * learningRate;
            gradients_output.HadamardProduct(outputsOutput);
            Matrix.Matrix hiddenTransposed = hiddenOutput.TransposeMatrix();
            Matrix.Matrix outputs_deltas   = gradients_output * hiddenTransposed;

            //momentumMatrixOutput += outputs_deltas;
            //momentumMatrixOutput *= momentumRate;

            outputWeights += outputs_deltas;
            //outputWeights += momentumMatrixOutput;
            biasOutput += gradients_output;
            //biasOutput += outputs_deltas;

            //hidden layer errors
            Matrix.Matrix outputWeights_transposed = outputWeights.TransposeMatrix();
            Matrix.Matrix hiddenErrorsMatrix       = outputWeights_transposed * outputErrorsMatrix;

            mapMatrix(hiddenOutput);

            Matrix.Matrix gradients_hidden = hiddenErrorsMatrix * learningRate;
            gradients_hidden.HadamardProduct(hiddenOutput);

            Matrix.Matrix hidden_deltas = gradients_hidden * inputMatrix.TransposeMatrix();
            hiddenWeights += hidden_deltas;
            biasHidden    += gradients_hidden;
            //biasHidden += hidden_deltas;

            //MOMENTUM

            outputWeights += momentumMatrixOutput;
            hiddenWeights += momentumMatrixHidden;
            biasOutput    += momentumMatrixOutputBias;
            biasHidden    += momentumMatrixHiddenBias;

            momentumMatrixOutput     = outputs_deltas * momentumRate;
            momentumMatrixHidden     = hidden_deltas * momentumRate;
            momentumMatrixOutputBias = gradients_output * momentumRate;
            momentumMatrixHiddenBias = gradients_hidden * momentumRate;
        }
Esempio n. 4
0
        static void Main(string[] args)
        {
            Program p = new Program();

            p.LoadFromFile();

            Random rnd = new Random();

            NeuralNetwork nn = new NeuralNetwork(4, 4, 3, true);

            /*for (int j = 0; j < 90; ++j)
             * {
             *  Array.Clear(targetArray, 0, 3);
             *  for (int z = 0; z < numberOfInputs; ++z)
             *  {
             *      inputArray[z] = classification_train[j][z];
             *  }
             *  targetArray[(int)classification_train[j][4] - 1] = 1;
             *  Console.WriteLine("inputArray: " + inputArray[0] + " " + inputArray[1] + " targetArray: " + targetArray[0] + " " + targetArray[1] + " " + targetArray[2]);
             * }*/

            double[] second = new double[] { 0, 1, 0 };

            for (int i = 0; i < 1000; ++i)
            {
                foreach (int j in Enumerable.Range(0, 90).OrderBy(x => rnd.Next()))
                {
                    Array.Clear(targetArray, 0, 3);

                    //wypełnianie całej inputArray na początek
                    for (int z = 0; z < numberOfInputs; ++z)
                    {
                        inputArray[z] = classification_train[j][z];
                    }
                    targetArray[(int)classification_train[j][4] - 1] = 1;
                    //Console.WriteLine("inputArray: " + inputArray[0] + " " + inputArray[1]);

                    /*if (classification_train[j][4] == 2)
                     * {
                     *  Console.WriteLine("DWAAAAAAAAAAAAA");
                     *  targetArray = second;
                     * }*/
                    nn.train(inputArray, targetArray);
                }
            }

            Matrix.Matrix output              = new Matrix.Matrix(3, 1);
            Matrix.Matrix confusionMatrix     = new Matrix.Matrix(3, 3);
            double        numberOfCorrect     = 0;
            double        percentOfCorectness = 0;
            int           predictedOutput     = 0;

            for (int i = 0; i < 93; ++i)
            {
                for (int z = 0; z < numberOfInputs; ++z)
                {
                    inputArray[z] = classification_test[i][z];
                }

                output = nn.feedForward(inputArray);
                output = output.TransposeMatrix();

                //POTRZEBNE DO LICZNIEA BŁĘDU ŚREDNIOKWADRATOWEGO

                /*Array.Clear(targetArray, 0, 3);
                 * targetArray[(int)classification_test[i][4] - 1] = 1;
                 * Console.WriteLine(" targetArray: " + targetArray[0] + " " + targetArray[1] + " " + targetArray[2]);*/


                //LICZENIE PROCENTA POPRAWNOŚCI
                if (output.tab[0, 0] > output.tab[0, 1] && output.tab[0, 0] > output.tab[0, 2] && classification_test[i][4] == 1)
                {
                    ++numberOfCorrect;
                }
                else if (output.tab[0, 1] > output.tab[0, 0] && output.tab[0, 1] > output.tab[0, 2] && classification_test[i][4] == 2)
                {
                    ++numberOfCorrect;
                }
                else if (output.tab[0, 2] > output.tab[0, 0] && output.tab[0, 2] > output.tab[0, 1] && classification_test[i][4] == 3)
                {
                    ++numberOfCorrect;
                }

                predictedOutput = 0;
                if (output.tab[0, 0] > output.tab[0, 1] && output.tab[0, 0] > output.tab[0, 2])
                {
                    predictedOutput = 1;
                }
                else if (output.tab[0, 1] > output.tab[0, 0] && output.tab[0, 1] > output.tab[0, 2])
                {
                    predictedOutput = 2;
                }
                else if (output.tab[0, 2] > output.tab[0, 0] && output.tab[0, 2] > output.tab[0, 1])
                {
                    predictedOutput = 3;
                }

                //WYPEŁNIANIE MACIERZY POMYŁEK (confusionMatrix)
                if (predictedOutput > 0)
                {
                    confusionMatrix.tab[(int)classification_test[i][4] - 1, predictedOutput - 1]++;
                }

                output.DisplayMatrix();
            }

            percentOfCorectness  = numberOfCorrect / 93;
            percentOfCorectness *= 100;
            //Console.WriteLine("\nNumber of correct: " + numberOfCorrect);
            Console.WriteLine("\nPercentage of corectness: " + percentOfCorectness);
            Console.WriteLine("\nConfusion matrix: ");
            confusionMatrix.DisplayMatrix();
        }