/// <summary> /// Construct a trainer to train a supercluster using the sandpit's example data. /// </summary> /// <param name="supercluster">Supercluster to train.</param> /// <param name="clusterRate">Number of subcycles between clustering.</param> /// <param name="mergingRate">Number of subcylces between merging.</param> /// <param name="maxThreads">Max number of concurrent threads to spawn during training.</param> public ExampleTrainer(Supercluster supercluster, uint clusterRate, uint mergingRate, int maxThreads) { this.Supercluster = supercluster; this.maxThreads = (maxThreads < 1)? 1 : maxThreads; this.Cycle = 0; this.clusterRate = clusterRate; this.mergingRate = mergingRate; // Load datasets. var testingDataset = this.LoadDatasetFromCSV("data/eg-testing-set.csv"); var positiveTrainingDataset = this.LoadDatasetFromCSV("data/eg-training-set-positive.csv"); var negativeTrainingDataset = this.LoadDatasetFromCSV("data/eg-training-set-negative.csv"); var trainingDataset = positiveTrainingDataset.Concat(negativeTrainingDataset).ToList(); // Find max values for normalisation. var completeDataset = trainingDataset.Concat(testingDataset); this.maxAge = completeDataset.Max(o => o.Age); this.maxSpendCategoryA = completeDataset.Max(o => o.SpendCategoryA); this.maxSpendCategoryB = completeDataset.Max(o => o.SpendCategoryA); // Normalise datasets. this.TestingDataset = this.NormaliseDataset(testingDataset); this.TrainingDataset = this.NormaliseDataset(trainingDataset); this.BestTestingScore = double.MinValue; this.MaxTestingScore = this.TestingDataset.Count; this.BestTrainingScore = double.MinValue; this.MaxTrainingScore = this.TrainingDataset.Count; }
static void Main(string[] args) { Console.WriteLine("CBANE SANDPIT"); Console.WriteLine("-------------------------"); Console.WriteLine(""); var superclusterConfig = new SuperclusterConfig(5); var clusterConfig = new ClusterConfig(50, 0.20, 0.05); var networkConfig = new NetworkConfig(3, 2, 3, 12); networkConfig.InputActivation = ActivationTypes.Passthrough; networkConfig.OutputActivation = ActivationTypes.Softmax; networkConfig.HiddenActivation = ActivationTypes.LeakyReLU; var supercluster = new Supercluster(superclusterConfig, clusterConfig, networkConfig); supercluster.GenerateRandomPopulation(); Trainer = new ExampleTrainer(supercluster, 25, 50, 15); outputStatus = ProgramStatus.IDLE; var outputTask = Task.Run(() => ManageOutput()); Task trainingTask = null; while (running) { var keyInfo = Console.ReadKey(true); if (outputStatus == ProgramStatus.IDLE && keyInfo.Key == ConsoleKey.T) { outputStatus = ProgramStatus.TRAINING; trainingTask = Task.Run(() => PerformTrainingRun()); } else if (outputStatus == ProgramStatus.IDLE && keyInfo.Key == ConsoleKey.O) { outputStatus = ProgramStatus.OUTPUT; OutputBestWeights(); outputStatus = ProgramStatus.IDLE; } else if (outputStatus == ProgramStatus.TRAINING && keyInfo.Key == ConsoleKey.S) { outputStatus = ProgramStatus.STOPPING; Trainer.StopTraining(); if (trainingTask != null && !trainingTask.IsCompleted) { trainingTask.Wait(); } outputStatus = ProgramStatus.IDLE; } else if (keyInfo.Key == ConsoleKey.X) { outputStatus = ProgramStatus.EXITING; Trainer.StopTraining(); if (trainingTask != null && !trainingTask.IsCompleted) { trainingTask.Wait(); } running = false; outputTask.Wait(); } } }