static void TestNN(MultiLayerNetwork nw, List <GradeDigest> testDigests, int run) { List <Tuple <bool, double> > results = new List <Tuple <bool, double> >(); foreach (var gd in testDigests) { double[] output = new double[4]; nw.NetOUT(NNUtils.ToNetworkInput(GradeDigest.UnpackBits(gd.data)), out output); int ans = inputCodes[NNUtils.Answer(output)]; double certainity = NNUtils.AnswerConfidence(output); results.Add(new Tuple <bool, double>(ans == gd.grade, certainity)); } double confidenceThreshold = results.Select(t => t.Item2).OrderBy(x => x).ElementAt((int)Math.Floor(results.Count * 0.95)); confidenceThreshold = 0.0001; int testSuccess = 0; int testFailure = 0; int sureTestSuccess = 0; int sureTestFailure = 0; int unsure = 0; foreach (var res in results) { if (res.Item1) { testSuccess++; } else { testFailure++; } if (res.Item2 > confidenceThreshold) { unsure++; } else if (res.Item1) { sureTestSuccess++; } else { sureTestFailure++; } } Func <int, double> perc = x => ((double)x / testDigests.Count * 100); Console.WriteLine("Test results (r/w%): {0:F2}/{1:F2}", perc(testSuccess), perc(testFailure)); Console.WriteLine("Test results (r/u/w%): {0:F2}/{1:F2}/{2:F2} (confidence threshold = {3})", perc(sureTestSuccess), perc(unsure), perc(sureTestFailure), confidenceThreshold); nw.SaveNW(String.Format("e:/Pronko/prj/Grader/ocr-data/grade-recognition_{0}_{1:F2}_{2:F2}.nn", run, perc(testSuccess), perc(sureTestFailure))); }
public static RecognitionResult RecognizeGrade(GradeDigest digest) { List <int> gradeCodes = new List <int> { 2, 3, 4, 5 }; double[] output = new double[4]; gradeRecognitionNetwork.NetOUT(NNUtils.ToNetworkInput(GradeDigest.UnpackBits(digest.data)), out output); return(new RecognitionResult( grade: gradeCodes[NNUtils.Answer(output)], confident: NNUtils.AnswerConfidence(output) < recognitionConfidenceThreshold )); }