protected async Task BeginTrainNetwork() { await Task.Factory.StartNew(() => { lock (locker) { ReadyToTrain = false; Training = true; IsRunning = true; Status = "Training"; var localIteration = 0; var rand = new Random(); var width = (int)Math.Sqrt(network.Layers[0].Neurons.Length); var trainer = new SOMTrainer(width, width, network); var fixedLearningRate = LearningRate / 10.0; var driftingLearningRate = fixedLearningRate * 9.0; var maxIterations = Iterations + CurrentIteration; var input = new double[3]; while (CurrentIteration < maxIterations && IsRunning) { trainer.LearningRate = driftingLearningRate * (Iterations - localIteration) / Iterations + this.LearningRate; trainer.LearningRadius = (double)ClusterRadius * (Iterations - localIteration) / Iterations; for (var i = 0; i < input.Length; i++) { input[i] = rand.NextDouble(); } trainer.Run(input); if (CurrentIteration % RefreshRate == 0) { try { BitMap.Dispatcher.Invoke(UpdateMap); } catch (TaskCanceledException) { } } CurrentIteration++; localIteration++; } BitMap.Dispatcher.Invoke(UpdateMap); Status = "Ready"; Training = false; ReadyToTrain = true; } }); }
public static void Demo() { SOMNetwork network = SOMNetwork.Create(9, 3); network.Display(); var dataSet = DataGenerator.GenerateDataSet3(); var som = new SOM(network); List <SOMSetting> setting = new List <SOMSetting>(); setting.Add(new SOMSetting() { FromEpoch = 0, ToEpoch = 500, LearningRate = 0.8, Radius = 2 }); setting.Add(new SOMSetting() { FromEpoch = 501, ToEpoch = 1000, LearningRate = 0.4, Radius = 1 }); SOMTrainer trainer = new SOMTrainer(network, 1000, som, setting); //Normalizer2 normalizer = new Normalizer2(); Normalizer2 normalizer = new Normalizer2(); normalizer.Fit(dataSet.XList); var normalizedX = normalizer.Normalize(dataSet.XList); trainer.Fit(normalizedX); List <List <double> > convertedX = trainer.GetOutputs(normalizedX); List <List <double> > convertedX2 = trainer.GetOutputs2(normalizedX); network.Display(); Console.WriteLine("OLD VECTORS===>"); Utils.DisplayListList(dataSet.XList); Console.WriteLine("OLD VECTORS(NORMALIZED)===>"); Utils.DisplayListList(normalizedX); Console.WriteLine("NEW CLUSTERED VECTORS===>"); Utils.DisplayListList(convertedX); Console.WriteLine("NEW CLUSTERED VECTORS(DISTANCE)===>"); Utils.DisplayListList(convertedX2); StringBuilder sb_x = new StringBuilder(); StringBuilder sb_y = new StringBuilder(); foreach (var l in convertedX2) { var maxIndex = l.IndexOf(l.Max()); for (var x = 0; x < network.OutputNeuronCountPerDim; x++) { for (var y = 0; y < network.OutputNeuronCountPerDim; y++) { if (x * network.OutputNeuronCountPerDim + y == maxIndex) { sb_x.Append(x + ","); sb_y.Append(y + ","); Console.Write("(" + x + "," + y + "),"); } } } Console.WriteLine(); } StringBuilder sb = new StringBuilder(); sb.AppendLine("import matplotlib.pyplot as plt"); sb.AppendLine("x1=[" + sb_x.ToString().TrimEnd(",".ToCharArray()) + "]"); sb.AppendLine("y1=[" + sb_y.ToString().TrimEnd(",".ToCharArray()) + "]"); sb.AppendLine("plt.plot(x1,y1,'b^')"); sb.AppendLine("plt.show()"); var file = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "display.py"); File.WriteAllText(file, sb.ToString()); Console.WriteLine("saved to path: " + file); System.Diagnostics.Process.Start("C:\\ProgramData\\Anaconda3\\envs\\keras\\python.exe", "\"" + file + "\""); }