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;
                }
            });
        }
Esempio n. 2
0
        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 + "\"");
        }