private static void NeuralNetworkLearningSingleAttributes(LearningData learningData) { var stopWatch = new Stopwatch(); stopWatch.Start(); var testMatcher = new LoggingNeuralNetworkMatcher(learningData.TestData); var trainingMatcher = new LoggingNeuralNetworkMatcher(learningData.TrainingData); Parallel.ForEach(learningData.ActualMetadata.Keys, metadataKey => { var metadata = new Dictionary <string, IndexableAttributeMetadata> { { metadataKey, learningData.ActualMetadata[metadataKey] } }; var trainingInputs = learningData.TrainingData.Select(data => data.ToVectorArray(metadata)).ToArray(); var trainingOutputs = learningData.TrainingData.Select(data => new[] { data.PercentMatch }).ToArray(); var testInputs = learningData.TestData.Select(data => data.ToVectorArray(metadata)).ToArray(); var testOutputs = learningData.TestData.Select(data => new[] { data.PercentMatch }).ToArray(); if (testInputs.Length != testOutputs.Length || trainingInputs.Length != trainingOutputs.Length) { throw new ArgumentException("Inputs and outputs data are not the same size"); } var vectorSize = trainingInputs.First().Length; if (trainingInputs.Any(input => input.Length != vectorSize)) { throw new ArgumentException("Not all trainingInputs have the same vector size"); } if (testInputs.Any(input => input.Length != vectorSize)) { throw new ArgumentException("Not test inputs have the correct vector size"); } var results = new List <Tuple <int[], double, double> >(); Parallel.For(0, 16, i => { var parameters = new[] { i, 1 }; var network = new ActivationNetwork(new BipolarSigmoidFunction(), trainingInputs[0].Length, parameters); //new DeepBeliefNetwork(); var teacher = new ParallelResilientBackpropagationLearning(network); var random = new Random(); var error = double.MaxValue; var iteration = 0; while (error > 0.0005 && iteration < 200) { iteration++; //for (var i = 0; i < 10; i++) { //* var pair = random.Next(0, trainingInputs.Length - 1); error = teacher.Run(trainingInputs[pair], trainingOutputs[pair]); //*/ /* * error = teacher.RunEpoch(trainingInputs, trainingOutputs); * //*/ var accuracyRecallPrecision = trainingMatcher.MatchCount(network, metadata, new List <string>()); error = 3 - accuracyRecallPrecision.Item1 - accuracyRecallPrecision.Item2 - accuracyRecallPrecision.Item3; } if (iteration % 100 == 0) { Logger.DebugFormat("NeuralNetwork: Iteration {0} Error {1}", iteration, error); } } var inSampleError = teacher.ComputeError(trainingInputs, trainingOutputs); var outOfSampleError = teacher.ComputeError(testInputs, testOutputs); lock (results) { results.Add(new Tuple <int[], double, double>(parameters, inSampleError, outOfSampleError)); } testMatcher.LogMatchCount(string.Format("{0} ({1})", metadataKey, learningData.ActualMetadata[metadataKey].Attribute.GetType().FullName), network, metadata, new List <string>()); }); Logger.InfoFormat("Results for {1} ({2}):\n{0}", string.Join(", ", results.Select(result => $"{string.Join("-", result.Item1)}: In: {result.Item2} Out: {result.Item3}")), metadataKey, learningData.ActualMetadata[metadataKey].Attribute.GetType().FullName); }); stopWatch.Stop(); Logger.InfoFormat("Neural Network learning (single attribute) took {0}", stopWatch.Elapsed); }
public void Learn() { var stopWatch = new Stopwatch(); stopWatch.Start(); var trainingInputs = LearningData.TrainingData.Select(data => data.ToVectorArray(Metadata, PropertiesToSkip)).ToArray(); var trainingOutputs = LearningData.TrainingData.Select(data => new[] { data.PercentMatch }).ToArray(); var testInputs = LearningData.TestData.Select(data => data.ToVectorArray(Metadata, PropertiesToSkip)).ToArray(); var testOutputs = LearningData.TestData.Select(data => new[] { data.PercentMatch }).ToArray(); if (testInputs.Length != testOutputs.Length || trainingInputs.Length != trainingOutputs.Length) { throw new ArgumentException("Inputs and outputs data are not the same size"); } var vectorSize = trainingInputs.First().Length; if (trainingInputs.Any(input => input.Length != vectorSize)) { throw new ArgumentException("Not all trainingInputs have the same vector size"); } if (testInputs.Any(input => input.Length != vectorSize)) { throw new ArgumentException("Not test inputs have the correct vector size"); } var testMatcher = new LoggingNeuralNetworkMatcher(LearningData.TestData); var trainingMatcher = new LoggingNeuralNetworkMatcher(LearningData.TrainingData); var results = new List <Tuple <int[], double, double> >(); Parallel.For(Range.Min, Range.Max + 1, i => { var parameters = i > 0 ? new[] { i, 1 } : new [] { 1 }; var network = new ActivationNetwork(new BipolarSigmoidFunction(), trainingInputs[0].Length, parameters); //new DeepBeliefNetwork(); var teacher = new ParallelResilientBackpropagationLearning(network); var random = new Random(); var error = double.MaxValue; var iteration = 0; while (error > 0.0005 && iteration < 1000) { iteration++; { var pair = random.Next(0, trainingInputs.Length - 1); teacher.Run(trainingInputs[pair], trainingOutputs[pair]); var accuracyRecallPrecision = trainingMatcher.MatchCount(network, Metadata, PropertiesToSkip); error = 3 - accuracyRecallPrecision.Item1 - accuracyRecallPrecision.Item2 - accuracyRecallPrecision.Item3; } if (iteration % 100 == 0) { Logger.DebugFormat("NeuralNetwork: Iteration {0} Error {1}", iteration, error); } } var inSampleError = teacher.ComputeError(trainingInputs, trainingOutputs); var outOfSampleError = teacher.ComputeError(testInputs, testOutputs); lock (results) { results.Add(new Tuple <int[], double, double>(parameters, inSampleError, outOfSampleError)); if (error < BestError) { BestNetwork = network; BestParameter = i; BestError = error; } } testMatcher.LogMatchCount(string.Format("{0}: {1}", Name, string.Join("-", parameters)), network, Metadata, PropertiesToSkip); }); Logger.DebugFormat("Results ({0}):\n{1}", Name, string.Join(", ", results.Select(result => $"{string.Join("-", result.Item1)}: In: {result.Item2} Out: {result.Item3}"))); Logger.InfoFormat("Best {0}: {1}-1 Error {2}", Name, BestParameter, BestError); stopWatch.Stop(); Logger.InfoFormat("Neural Network learning ({0}) took {1}", Name, stopWatch.Elapsed); }