Exemplo n.º 1
0
        static double[][] MakeAllData(int numInput2, int numHidden3, int numHidden4, int numOutput2, int numRows2, int seed2)
        {
            Random rnd        = new Random(seed2);
            int    numWeights = (numInput2 * numHidden3) + numHidden4 +
                                (numHidden4 * numOutput2) + numOutput2;

            double[] weights = new double[numWeights]; // actually weights & biases
            for (int i = 0; i < numWeights; ++i)
            {
                weights[i] = 20.0 * rnd.NextDouble() - 10.0; // [-10.0 to 10.0]
            }
            Console.WriteLine("Generating weights and biases:");
            ShowVector(weights, 2, 10, true);

            double[][] result = new double[numRows2][]; // allocate return-result
            for (int i = 0; i < numRows2; ++i)
            {
                result[i] = new double[numInput2 + numOutput2]; // 1-of-N in last column
            }
            NeuralNetwork1 gnn =
                new NeuralNetwork1(numInput2, numHidden3, numHidden4, numOutput2, numRows2, seed2); // generating NN

            gnn.SetWeights(weights);

            for (int r = 0; r < numRows2; ++r) // for each row
            {
                // generate random inputs
                double[] inputs = new double[numInput2];
                for (int i = 0; i < numInput2; ++i)
                {
                    inputs[i] = 20.0 * rnd.NextDouble() - 10.0; // [-10.0 to -10.0]
                }
                // compute outputs
                double[] outputs = gnn.ComputeOutputs(inputs);

                // translate outputs to 1-of-N
                double[] oneOfN = new double[numOutput2]; // all 0.0

                int    maxIndex = 0;
                double maxValue = outputs[0];
                for (int i = 0; i < numOutput2; ++i)
                {
                    if (outputs[i] > maxValue)
                    {
                        maxIndex = i;
                        maxValue = outputs[i];
                    }
                }
                oneOfN[maxIndex] = 1.0;

                // place inputs and 1-of-N output values into curr row
                int c = 0;                          // column into result[][]
                for (int i = 0; i < numInput2; ++i) // inputs
                {
                    result[r][c++] = inputs[i];
                }
                for (int i = 0; i < numOutput2; ++i) // outputs
                {
                    result[r][c++] = oneOfN[i];
                }
            } // each row
            return(result);
        }     // MakeAllData
Exemplo n.º 2
0
        static void Main(string[] args)
        {
            Console.WriteLine("\nbegin ANN.\n");
            int numInput2  = 4; // number features
            int numHidden3 = 5;
            int numHidden4 = 5;
            int numOutput2 = 3; // number of classes for Y
            int numRows2   = 1000;
            int seed2      = 1; // gives nice demo

            Console.WriteLine("\nGenerating " + numRows2 +
                              " artificial data items with " + numInput2 + " features");
            double[][] allData = MakeAllData(numInput2, numHidden3, numHidden4, numOutput2,
                                             numRows2, seed2);
            Console.WriteLine("Done");

            //ShowMatrix(allData, allData.Length, 2, true);

            Console.WriteLine("\nCreating train (80%) and test (20%) matrices");
            double[][] trainData2;
            double[][] testData2;
            SplitTrainTest(allData, 0.80, seed2, out trainData2, out testData2);
            Console.WriteLine("Done\n");

            Console.WriteLine("Training data:");
            ShowMatrix(trainData2, 4, 2, true);
            Console.WriteLine("Test data:");
            ShowMatrix(testData2, 4, 2, true);

            Console.WriteLine("Creating a " + numInput2 + "-" + numHidden3 +
                              "-" + numHidden4 + "-" + numOutput2 + " neural network");
            NeuralNetwork1 nn = new NeuralNetwork1(numInput2, numHidden3, numHidden4, numOutput2, numRows2, seed2);

            int    maxEpochs = 1000;
            double learnRate = 0.05;
            double momentum  = 0.01;

            Console.WriteLine("\nSetting maxEpochs = " + maxEpochs);
            Console.WriteLine("Setting learnRate = " + learnRate.ToString("F2"));
            Console.WriteLine("Setting momentum  = " + momentum.ToString("F2"));

            Console.WriteLine("\nStarting training");
            double[] weights = nn.Train(trainData2, maxEpochs, learnRate, momentum);
            Console.WriteLine("Done");
            Console.WriteLine("\nFinal neural network model weights and biases:\n");
            //            ShowVector(weights, 2, 10, true);

            //double[] y = nn.ComputeOutputs(new double[] { 1.0, 2.0, 3.0, 4.0 });
            //ShowVector(y, 3, 3, true);

            double trainAcc = nn.Accuracy(trainData2);

            Console.WriteLine("\nFinal accuracy on training data = " +
                              trainAcc.ToString("F4"));

            double testAcc = nn.Accuracy(testData2);

            Console.WriteLine("Final accuracy on test data     = " +
                              testAcc.ToString("F4"));



            Console.WriteLine("\nBegin van Vector.\n");
            double[][] trainData = new double[4][];
            trainData[0] = new double[] { 2.0, 2.0 };  // data cannot be perfectly classified
            trainData[1] = new double[] { 3.5, -4.0 };
            trainData[2] = new double[] { 4.0, -5.5 };
            trainData[3] = new double[] { 4.5, -2.0 };

            int[] Y = new int[4] {
                0, 1, 1, 1
            };

            Console.WriteLine("\nTraining data: \n");
            ShowTrainData(trainData, Y);

            double[] weights2   = null;
            double   bias       = 0.0;
            double   alpha      = 0.001;
            int      maxEpochs2 = 500;

            Console.Write("\nSetting learning rate to " + alpha.ToString("F3"));
            Console.WriteLine(" and maxEpochs to " + maxEpochs2);

            Console.WriteLine("\nBeginning training the perceptron");
            Train(trainData, alpha, maxEpochs2, Y, out weights2, out bias);
            Console.WriteLine("Training complete");

            Console.WriteLine("\nBest percetron weights found: ");
            ShowVector(weights2, 4);
            Console.WriteLine("\nBest perceptron bias found = " + bias.ToString("F4"));

            double acc = Accuracy(trainData, weights2, bias, Y);

            Console.Write("\nAccuracy of the perceptron on the training data = ");
            Console.WriteLine(acc.ToString("F2"));
            Console.WriteLine("\nDone\n");
            Console.ReadLine();
        } //Main