double CheckAccuracy(ANeuralNetwork ann) { double error = 0; for (int i = 0; i < inputs.Count; i++) { for (int j = 0; j < outputs[i].Count; j++) { var tmp = ann.Predict(inputs[i])[j]; error += (outputs[i][j] - ann.Predict(inputs[i])[j]) * (outputs[i][j] - ann.Predict(inputs[i])[j]); } } return(Math.Sqrt(error / inputs.Count)); }
public void CheckOne() { ANeuralNetwork network = new ANeuralNetwork(); network.Load("..\\..\\..\\..\\savedData.txt"); var sampleDirs = Directory.GetDirectories("..\\..\\..\\..\\Data\\TestData\\").ToList(); int fCount = Directory.GetFiles("..\\..\\..\\..\\Data\\GroundData\\", "*.png", SearchOption.AllDirectories).Length; var poliManager = new PolynomialManager(); poliManager.InitBasis(15, 100); double count = 0; foreach (var dir in sampleDirs) { var files = Directory.GetFiles(dir, "*.png", SearchOption.TopDirectoryOnly).ToList(); var index = new Random().Next(files.Count); var file = files[index]; var value = Convert.ToInt32(new StreamReader(dir + "\\" + "value.txt").ReadToEnd()); ++count; ComplexMoments tmpMoments; ProcessOneImage(file, poliManager, 100, out tmpMoments); CvInvoke.Imshow(dir, tmpMoments.Real); var tmpInput = tmpMoments.ToListOfDouble(); var output = network.Predict(tmpInput); var predictedValue = Convert.ToInt32(output.IndexOf(output.Max())); Console.WriteLine(predictedValue); CvInvoke.WaitKey(); } }
string Recognize(ComplexMoments moments) { ANeuralNetwork networt = new ANeuralNetwork(); var output = networt.Predict(moments.ToListOfDouble()); return(output.IndexOf(output.Max()).ToString()); }
static void Main(string[] args) { ANeuralNetwork tmp = new ANeuralNetwork(); tmp.Load("..\\..\\..\\..\\PerceptronSavedData.txt"); var line = Console.ReadLine(); while (line!="q") { var tmpInput = line.Split().Select(double.Parse).ToList(); var tmpOutput = tmp.Predict(tmpInput); foreach (var element in tmpOutput) { Console.WriteLine(element); } line = Console.ReadLine(); } }
public void Check() { ANeuralNetwork network = new ANeuralNetwork(); network.Load("..\\..\\..\\..\\savedData.txt"); var sampleDirs = Directory.GetDirectories("..\\..\\..\\..\\Data\\TestData\\").ToList(); int fCount = Directory.GetFiles("..\\..\\..\\..\\Data\\GroundData\\", "*.png", SearchOption.AllDirectories).Length; double precision = 0; var poliManager = new PolynomialManager(); poliManager.InitBasis(15, 100); double count = 0; double trueCount = 0; foreach (var dir in sampleDirs) { var files = Directory.GetFiles(dir, "*.png", SearchOption.TopDirectoryOnly).ToList(); var value = Convert.ToInt32(new StreamReader(dir + "\\" + "value.txt").ReadToEnd()); foreach (var file in files) { ++count; ComplexMoments tmpMoments; ProcessOneImage(file, poliManager, 100, out tmpMoments); var tmpInput = tmpMoments.ToListOfDouble(); var output = network.Predict(tmpInput); var predictedValue = Convert.ToInt32(output.IndexOf(output.Max())); if (predictedValue == value) { //++trueCount; precision += Convert.ToDouble(100 / (double)fCount); } } Console.WriteLine("Точность " + precision + "%"); //Console.WriteLine("Точность " + trueCount/count + "%"); } }
public void IrisClasificationTest() { #region Training Data //Encoded // Iris setosa = 1 0 0 // Iris versicolor = 0 1 0 // Iris virginica = 0 0 1 string[] rawData = new[] { "setosa", "versicolor", "virginica" }; double[][] encodedData = new double[150][]; encodedData[0] = new double[] { 5.1, 3.5, 1.4, 0.2, 0, 0, 1 }; encodedData[1] = new double[] { 4.9, 3.0, 1.4, 0.2, 0, 0, 1 }; encodedData[2] = new double[] { 4.7, 3.2, 1.3, 0.2, 0, 0, 1 }; encodedData[3] = new double[] { 4.6, 3.1, 1.5, 0.2, 0, 0, 1 }; encodedData[4] = new double[] { 5.0, 3.6, 1.4, 0.2, 0, 0, 1 }; encodedData[5] = new double[] { 5.4, 3.9, 1.7, 0.4, 0, 0, 1 }; encodedData[6] = new double[] { 4.6, 3.4, 1.4, 0.3, 0, 0, 1 }; encodedData[7] = new double[] { 5.0, 3.4, 1.5, 0.2, 0, 0, 1 }; encodedData[8] = new double[] { 4.4, 2.9, 1.4, 0.2, 0, 0, 1 }; encodedData[9] = new double[] { 4.9, 3.1, 1.5, 0.1, 0, 0, 1 }; encodedData[10] = new double[] { 5.4, 3.7, 1.5, 0.2, 0, 0, 1 }; encodedData[11] = new double[] { 4.8, 3.4, 1.6, 0.2, 0, 0, 1 }; encodedData[12] = new double[] { 4.8, 3.0, 1.4, 0.1, 0, 0, 1 }; encodedData[13] = new double[] { 4.3, 3.0, 1.1, 0.1, 0, 0, 1 }; encodedData[14] = new double[] { 5.8, 4.0, 1.2, 0.2, 0, 0, 1 }; encodedData[15] = new double[] { 5.7, 4.4, 1.5, 0.4, 0, 0, 1 }; encodedData[16] = new double[] { 5.4, 3.9, 1.3, 0.4, 0, 0, 1 }; encodedData[17] = new double[] { 5.1, 3.5, 1.4, 0.3, 0, 0, 1 }; encodedData[18] = new double[] { 5.7, 3.8, 1.7, 0.3, 0, 0, 1 }; encodedData[19] = new double[] { 5.1, 3.8, 1.5, 0.3, 0, 0, 1 }; encodedData[20] = new double[] { 5.4, 3.4, 1.7, 0.2, 0, 0, 1 }; encodedData[21] = new double[] { 5.1, 3.7, 1.5, 0.4, 0, 0, 1 }; encodedData[22] = new double[] { 4.6, 3.6, 1.0, 0.2, 0, 0, 1 }; encodedData[23] = new double[] { 5.1, 3.3, 1.7, 0.5, 0, 0, 1 }; encodedData[24] = new double[] { 4.8, 3.4, 1.9, 0.2, 0, 0, 1 }; encodedData[25] = new double[] { 5.0, 3.0, 1.6, 0.2, 0, 0, 1 }; encodedData[26] = new double[] { 5.0, 3.4, 1.6, 0.4, 0, 0, 1 }; encodedData[27] = new double[] { 5.2, 3.5, 1.5, 0.2, 0, 0, 1 }; encodedData[28] = new double[] { 5.2, 3.4, 1.4, 0.2, 0, 0, 1 }; encodedData[29] = new double[] { 4.7, 3.2, 1.6, 0.2, 0, 0, 1 }; encodedData[30] = new double[] { 4.8, 3.1, 1.6, 0.2, 0, 0, 1 }; encodedData[31] = new double[] { 5.4, 3.4, 1.5, 0.4, 0, 0, 1 }; encodedData[32] = new double[] { 5.2, 4.1, 1.5, 0.1, 0, 0, 1 }; encodedData[33] = new double[] { 5.5, 4.2, 1.4, 0.2, 0, 0, 1 }; encodedData[34] = new double[] { 4.9, 3.1, 1.5, 0.1, 0, 0, 1 }; encodedData[35] = new double[] { 5.0, 3.2, 1.2, 0.2, 0, 0, 1 }; encodedData[36] = new double[] { 5.5, 3.5, 1.3, 0.2, 0, 0, 1 }; encodedData[37] = new double[] { 4.9, 3.1, 1.5, 0.1, 0, 0, 1 }; encodedData[38] = new double[] { 4.4, 3.0, 1.3, 0.2, 0, 0, 1 }; encodedData[39] = new double[] { 5.1, 3.4, 1.5, 0.2, 0, 0, 1 }; encodedData[40] = new double[] { 5.0, 3.5, 1.3, 0.3, 0, 0, 1 }; encodedData[41] = new double[] { 4.5, 2.3, 1.3, 0.3, 0, 0, 1 }; encodedData[42] = new double[] { 4.4, 3.2, 1.3, 0.2, 0, 0, 1 }; encodedData[43] = new double[] { 5.0, 3.5, 1.6, 0.6, 0, 0, 1 }; encodedData[44] = new double[] { 5.1, 3.8, 1.9, 0.4, 0, 0, 1 }; encodedData[45] = new double[] { 4.8, 3.0, 1.4, 0.3, 0, 0, 1 }; encodedData[46] = new double[] { 5.1, 3.8, 1.6, 0.2, 0, 0, 1 }; encodedData[47] = new double[] { 4.6, 3.2, 1.4, 0.2, 0, 0, 1 }; encodedData[48] = new double[] { 5.3, 3.7, 1.5, 0.2, 0, 0, 1 }; encodedData[49] = new double[] { 5.0, 3.3, 1.4, 0.2, 0, 0, 1 }; encodedData[50] = new double[] { 7.0, 3.2, 4.7, 1.4, 0, 1, 0 }; encodedData[51] = new double[] { 6.4, 3.2, 4.5, 1.5, 0, 1, 0 }; encodedData[52] = new double[] { 6.9, 3.1, 4.9, 1.5, 0, 1, 0 }; encodedData[53] = new double[] { 5.5, 2.3, 4.0, 1.3, 0, 1, 0 }; encodedData[54] = new double[] { 6.5, 2.8, 4.6, 1.5, 0, 1, 0 }; encodedData[55] = new double[] { 5.7, 2.8, 4.5, 1.3, 0, 1, 0 }; encodedData[56] = new double[] { 6.3, 3.3, 4.7, 1.6, 0, 1, 0 }; encodedData[57] = new double[] { 4.9, 2.4, 3.3, 1.0, 0, 1, 0 }; encodedData[58] = new double[] { 6.6, 2.9, 4.6, 1.3, 0, 1, 0 }; encodedData[59] = new double[] { 5.2, 2.7, 3.9, 1.4, 0, 1, 0 }; encodedData[60] = new double[] { 5.0, 2.0, 3.5, 1.0, 0, 1, 0 }; encodedData[61] = new double[] { 5.9, 3.0, 4.2, 1.5, 0, 1, 0 }; encodedData[62] = new double[] { 6.0, 2.2, 4.0, 1.0, 0, 1, 0 }; encodedData[63] = new double[] { 6.1, 2.9, 4.7, 1.4, 0, 1, 0 }; encodedData[64] = new double[] { 5.6, 2.9, 3.6, 1.3, 0, 1, 0 }; encodedData[65] = new double[] { 6.7, 3.1, 4.4, 1.4, 0, 1, 0 }; encodedData[66] = new double[] { 5.6, 3.0, 4.5, 1.5, 0, 1, 0 }; encodedData[67] = new double[] { 5.8, 2.7, 4.1, 1.0, 0, 1, 0 }; encodedData[68] = new double[] { 6.2, 2.2, 4.5, 1.5, 0, 1, 0 }; encodedData[69] = new double[] { 5.6, 2.5, 3.9, 1.1, 0, 1, 0 }; encodedData[70] = new double[] { 5.9, 3.2, 4.8, 1.8, 0, 1, 0 }; encodedData[71] = new double[] { 6.1, 2.8, 4.0, 1.3, 0, 1, 0 }; encodedData[72] = new double[] { 6.3, 2.5, 4.9, 1.5, 0, 1, 0 }; encodedData[73] = new double[] { 6.1, 2.8, 4.7, 1.2, 0, 1, 0 }; encodedData[74] = new double[] { 6.4, 2.9, 4.3, 1.3, 0, 1, 0 }; encodedData[75] = new double[] { 6.6, 3.0, 4.4, 1.4, 0, 1, 0 }; encodedData[76] = new double[] { 6.8, 2.8, 4.8, 1.4, 0, 1, 0 }; encodedData[77] = new double[] { 6.7, 3.0, 5.0, 1.7, 0, 1, 0 }; encodedData[78] = new double[] { 6.0, 2.9, 4.5, 1.5, 0, 1, 0 }; encodedData[79] = new double[] { 5.7, 2.6, 3.5, 1.0, 0, 1, 0 }; encodedData[80] = new double[] { 5.5, 2.4, 3.8, 1.1, 0, 1, 0 }; encodedData[81] = new double[] { 5.5, 2.4, 3.7, 1.0, 0, 1, 0 }; encodedData[82] = new double[] { 5.8, 2.7, 3.9, 1.2, 0, 1, 0 }; encodedData[83] = new double[] { 6.0, 2.7, 5.1, 1.6, 0, 1, 0 }; encodedData[84] = new double[] { 5.4, 3.0, 4.5, 1.5, 0, 1, 0 }; encodedData[85] = new double[] { 6.0, 3.4, 4.5, 1.6, 0, 1, 0 }; encodedData[86] = new double[] { 6.7, 3.1, 4.7, 1.5, 0, 1, 0 }; encodedData[87] = new double[] { 6.3, 2.3, 4.4, 1.3, 0, 1, 0 }; encodedData[88] = new double[] { 5.6, 3.0, 4.1, 1.3, 0, 1, 0 }; encodedData[89] = new double[] { 5.5, 2.5, 4.0, 1.3, 0, 1, 0 }; encodedData[90] = new double[] { 5.5, 2.6, 4.4, 1.2, 0, 1, 0 }; encodedData[91] = new double[] { 6.1, 3.0, 4.6, 1.4, 0, 1, 0 }; encodedData[92] = new double[] { 5.8, 2.6, 4.0, 1.2, 0, 1, 0 }; encodedData[93] = new double[] { 5.0, 2.3, 3.3, 1.0, 0, 1, 0 }; encodedData[94] = new double[] { 5.6, 2.7, 4.2, 1.3, 0, 1, 0 }; encodedData[95] = new double[] { 5.7, 3.0, 4.2, 1.2, 0, 1, 0 }; encodedData[96] = new double[] { 5.7, 2.9, 4.2, 1.3, 0, 1, 0 }; encodedData[97] = new double[] { 6.2, 2.9, 4.3, 1.3, 0, 1, 0 }; encodedData[98] = new double[] { 5.1, 2.5, 3.0, 1.1, 0, 1, 0 }; encodedData[99] = new double[] { 5.7, 2.8, 4.1, 1.3, 0, 1, 0 }; encodedData[100] = new double[] { 6.3, 3.3, 6.0, 2.5, 1, 0, 0 }; encodedData[101] = new double[] { 5.8, 2.7, 5.1, 1.9, 1, 0, 0 }; encodedData[102] = new double[] { 7.1, 3.0, 5.9, 2.1, 1, 0, 0 }; encodedData[103] = new double[] { 6.3, 2.9, 5.6, 1.8, 1, 0, 0 }; encodedData[104] = new double[] { 6.5, 3.0, 5.8, 2.2, 1, 0, 0 }; encodedData[105] = new double[] { 7.6, 3.0, 6.6, 2.1, 1, 0, 0 }; encodedData[106] = new double[] { 4.9, 2.5, 4.5, 1.7, 1, 0, 0 }; encodedData[107] = new double[] { 7.3, 2.9, 6.3, 1.8, 1, 0, 0 }; encodedData[108] = new double[] { 6.7, 2.5, 5.8, 1.8, 1, 0, 0 }; encodedData[109] = new double[] { 7.2, 3.6, 6.1, 2.5, 1, 0, 0 }; encodedData[110] = new double[] { 6.5, 3.2, 5.1, 2.0, 1, 0, 0 }; encodedData[111] = new double[] { 6.4, 2.7, 5.3, 1.9, 1, 0, 0 }; encodedData[112] = new double[] { 6.8, 3.0, 5.5, 2.1, 1, 0, 0 }; encodedData[113] = new double[] { 5.7, 2.5, 5.0, 2.0, 1, 0, 0 }; encodedData[114] = new double[] { 5.8, 2.8, 5.1, 2.4, 1, 0, 0 }; encodedData[115] = new double[] { 6.4, 3.2, 5.3, 2.3, 1, 0, 0 }; encodedData[116] = new double[] { 6.5, 3.0, 5.5, 1.8, 1, 0, 0 }; encodedData[117] = new double[] { 7.7, 3.8, 6.7, 2.2, 1, 0, 0 }; encodedData[118] = new double[] { 7.7, 2.6, 6.9, 2.3, 1, 0, 0 }; encodedData[119] = new double[] { 6.0, 2.2, 5.0, 1.5, 1, 0, 0 }; encodedData[120] = new double[] { 6.9, 3.2, 5.7, 2.3, 1, 0, 0 }; encodedData[121] = new double[] { 5.6, 2.8, 4.9, 2.0, 1, 0, 0 }; encodedData[122] = new double[] { 7.7, 2.8, 6.7, 2.0, 1, 0, 0 }; encodedData[123] = new double[] { 6.3, 2.7, 4.9, 1.8, 1, 0, 0 }; encodedData[124] = new double[] { 6.7, 3.3, 5.7, 2.1, 1, 0, 0 }; encodedData[125] = new double[] { 7.2, 3.2, 6.0, 1.8, 1, 0, 0 }; encodedData[126] = new double[] { 6.2, 2.8, 4.8, 1.8, 1, 0, 0 }; encodedData[127] = new double[] { 6.1, 3.0, 4.9, 1.8, 1, 0, 0 }; encodedData[128] = new double[] { 6.4, 2.8, 5.6, 2.1, 1, 0, 0 }; encodedData[129] = new double[] { 7.2, 3.0, 5.8, 1.6, 1, 0, 0 }; encodedData[130] = new double[] { 7.4, 2.8, 6.1, 1.9, 1, 0, 0 }; encodedData[131] = new double[] { 7.9, 3.8, 6.4, 2.0, 1, 0, 0 }; encodedData[132] = new double[] { 6.4, 2.8, 5.6, 2.2, 1, 0, 0 }; encodedData[133] = new double[] { 6.3, 2.8, 5.1, 1.5, 1, 0, 0 }; encodedData[134] = new double[] { 6.1, 2.6, 5.6, 1.4, 1, 0, 0 }; encodedData[135] = new double[] { 7.7, 3.0, 6.1, 2.3, 1, 0, 0 }; encodedData[136] = new double[] { 6.3, 3.4, 5.6, 2.4, 1, 0, 0 }; encodedData[137] = new double[] { 6.4, 3.1, 5.5, 1.8, 1, 0, 0 }; encodedData[138] = new double[] { 6.0, 3.0, 4.8, 1.8, 1, 0, 0 }; encodedData[139] = new double[] { 6.9, 3.1, 5.4, 2.1, 1, 0, 0 }; encodedData[140] = new double[] { 6.7, 3.1, 5.6, 2.4, 1, 0, 0 }; encodedData[141] = new double[] { 6.9, 3.1, 5.1, 2.3, 1, 0, 0 }; encodedData[142] = new double[] { 5.8, 2.7, 5.1, 1.9, 1, 0, 0 }; encodedData[143] = new double[] { 6.8, 3.2, 5.9, 2.3, 1, 0, 0 }; encodedData[144] = new double[] { 6.7, 3.3, 5.7, 2.5, 1, 0, 0 }; encodedData[145] = new double[] { 6.7, 3.0, 5.2, 2.3, 1, 0, 0 }; encodedData[146] = new double[] { 6.3, 2.5, 5.0, 1.9, 1, 0, 0 }; encodedData[147] = new double[] { 6.5, 3.0, 5.2, 2.0, 1, 0, 0 }; encodedData[148] = new double[] { 6.2, 3.4, 5.4, 2.3, 1, 0, 0 }; encodedData[149] = new double[] { 5.9, 3.0, 5.1, 1.8, 1, 0, 0 }; #endregion var networkData = new NeuralNetworkData(rawData, ' '); networkData.PrepareTrainingSet( encodedData: encodedData, trainDataPercentage: 0.80d, seed: 72); ANeuralNetwork nn = new ANeuralNetwork( inputNodes: 4, hiddenNodes: 7, outputNodes: 3, hiddenNodeActivation: Activation.HyperTan, outputNodeActivation: Activation.Softmax); nn.Train( networkData.TrainingData, maxEpochs: 1000, learnRate: 0.05d, momentum: 0.01d, meanSquaredErrorThreshold: 0.040d); Assert.IsTrue(nn.GetAccuracyFor(networkData.TrainingData) > 0.95d); Assert.IsTrue(nn.GetAccuracyFor(networkData.TestData) > 0.95d); Assert.AreEqual("virginica", networkData.DecodeOutput(nn.Predict(new double[] { 5.1, 3.5, 1.4, 0.2 }))); Assert.AreEqual("versicolor", networkData.DecodeOutput(nn.Predict(new double[] { 7.0, 3.2, 4.7, 1.4 }))); Assert.AreEqual("setosa", networkData.DecodeOutput(nn.Predict(new double[] { 7.4, 2.8, 6.1, 1.9 }))); }