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
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