Beispiel #1
0
        public void TrainNetwork()
        {
            Console.WriteLine("Training network...");
            Console.WriteLine();

            Random  rnd = new Random();
            Parents potentialParents = new Parents();

            while (true)
            {
                if (shouldPause)
                {
                    return;
                }

                bool lastSuccess   = false;
                int  currParentInd = 0;

                if (currentParents.parentKernels.Count > 0)
                {
                    //if(currentParents.parentKernels.Length == convolution.kernels.Length)
                    //    convolution.SetKernels(currentParents.parentKernels);
                    currParentInd = (int)(rnd.NextDouble() * currentParents.parentKernels.Count);
                    convolution.SetKernels(currentParents.parentKernels[currParentInd].kernels);
                }

                convolution.MutateKernel(settings.mutationRate);

                float fitness = TestConnections(convolution, rnd);
                runningAvg.Enqueue(fitness);

                potentialParents.parentKernels.Add(new Parents.Parent(fitness, convolution.DeepCopyKernels(), gens > 0?currentParents.parentKernels[currParentInd].species + " " + (iters - gens * settings.childrenPerGen):iters.ToString()));

                //Genetic Selection
                if (iters % settings.childrenPerGen == settings.childrenPerGen - 1)
                {
                    currentParents = new Parents();

                    potentialParents.parentKernels.Sort(delegate(Parents.Parent x, Parents.Parent y)
                    {
                        return(x.fitness.CompareTo(y.fitness));
                    });

                    for (int x = 0; x < settings.parentsPerGeneration; x++)
                    {
                        //float rndval = (float)rnd.NextDouble();
                        //float newTarget = Map(potentialParents.parentKernels.Last().fitness, potentialParents.parentKernels.First().fitness, rndval);
                        //Parents.Parent newParent = potentialParents.parentKernels.First(y => y.fitness>=newTarget);
                        Parents.Parent newParent = potentialParents.parentKernels[potentialParents.parentKernels.Count - x - 1];
                        currentParents.parentKernels.Add(newParent);
                        //potentialParents.parentKernels.Remove(newParent);
                    }

                    potentialParents.parentKernels.Clear();

                    //Retest the previous best//This is tricky now, just assume all parents die after reproducing

                    /*if (currentParents.parentKernels.Length == convolution.kernels.Length)
                     * {
                     *  convolution.SetKernels(currentParents.parentKernels);
                     *  potentialParents.parentFitness = TestConnections(convolution, rnd);
                     * }*/

                    //TEMP
                    try
                    {
                        System.IO.File.WriteAllBytes("genOut.png", convolution.dstImg.ToBytes());
                        System.IO.File.WriteAllBytes("genIn.png", convolution.srcImgs[lastIndex].ToBytes());
                        //System.IO.File.WriteAllText(inpath, JsonConvert.SerializeObject(networkConnections));
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e.Message);
                    }

                    gens++;
                }

                if (runningAvg.Count > settings.overrallFitIters)
                {
                    runningAvg.Dequeue();
                }

                //GUI
                if (iters % 2 == 0)
                {
                    float overallFit = 0;
                    foreach (float i in runningAvg)
                    {
                        overallFit += i;
                    }
                    overallFit /= runningAvg.Count;

                    Console.Write("[" + (DateTime.Now - startTime).ToString(@"h\:mm\:ss") + "] Training... Current fitness: " + Math.Round(fitness)
                                  + "%; Overall fitness: " + Math.Round(overallFit)
                                  + "% \n[" + (DateTime.Now - startTime).ToString(@"h\:mm\:ss") + "] Best fitness (gen): " + Math.Round(potentialParents.parentKernels.FirstOrDefault().fitness)
                                  + "%; Iterations: " + iters
                                  + "; Generations: " + gens + "   "
                                  + "\n[" + (DateTime.Now - startTime).ToString(@"h\:mm\:ss") + "] List Parents: " + "                   \n");
                    for (int i = 0; i < currentParents.parentKernels.Count; i++)
                    {
                        Console.WriteLine("Parent: " + currentParents.parentKernels[i].species.Substring(Math.Max(currentParents.parentKernels[i].species.Length - 20, 0)) + " Fitness: " + currentParents.parentKernels[i].fitness + "  ");
                    }
                    Console.SetCursorPosition(0, Console.CursorTop - (3 + currentParents.parentKernels.Count));
                }

                if (lastSuccess)
                {
                    successIters++;
                }

                iters++;
            }
        }