示例#1
0
        public static Image <Rgba32> GenerateImage(List <List <Node> > network, Dictionary <string, bool> state, int size)
        {
            var img2 = new Image <Rgba32>(size, size);

            for (int x = 0; x < size; x++)
            {
                for (int y = 0; y < size; y++)
                {
                    double outx = x / (double)size * 2.0 - 1.0;
                    double outy = y / (double)size * 2.0 - 1.0;

                    var input    = MLHelper.ConstructInput(state, outx, outy);
                    var lastNode = NetworkBuilder.ForwardProp(network, input);

                    //byte r = (byte)(255 * (1 - lastNode));
                    //byte g = 0;
                    //byte b = 0;

                    //=MAX((1-((A2+1)/2) / 2 * 3) *255; 0)
                    byte r = (byte)Math.Max((1 - ((lastNode + 1) / 2.0) / 2.0 * 3.0) * 255.0, 0);
                    //=MAX((1-((A2+1)/2) / 2 * 6) *128; 0)
                    byte g = (byte)Math.Max((1 - ((lastNode + 1) / 2.0) / 2.0 * 6.0) * 128.0, 0);
                    //=MIN(MAX((((A2+1 - 0,6666)/2 / 2 *3) ) *255; 0); 255)
                    byte b = (byte)Math.Min(Math.Max((((lastNode + 1 - (2.0 / 3.0)) / 2.0 / 2.0 * 3.0)) * 255.0, 0), 255);

                    img2[x, y] = new Rgba32(r, g, b);

                    //var pntX = ((pnt.X + 1.0) / 2.0) * size;
                    //var pntY = ((pnt.Y + 1.0) / 2.0) * size;
                }
            }

            return(img2);
        }
示例#2
0
        public static double GetLoss(List <List <Node> > network, Dictionary <string, bool> state, List <Puntje> dataPoints)
        {
            double loss = 0;

            for (var i = 0; i < dataPoints.Count; i++)
            {
                var dataPoint = dataPoints[i];
                var input     = MLHelper.ConstructInput(state, dataPoint.X, dataPoint.Y);
                var output    = NetworkBuilder.ForwardProp(network, input);
                loss += Errors.SQUARE.Error(output, dataPoint.Label);
            }
            return(loss / dataPoints.Count);
        }
示例#3
0
        private void Go()
        {
            var lijstje = DataSetGenerator.Generate();


            int size = 500;
            var img  = new Image <Rgba32>(size, size);

            MLImager.AddPointsToImage(img, lijstje);

            using (var fs = new FileStream("output.png", FileMode.Create, FileAccess.Write, FileShare.Read))
            {
                img.SaveAsPng(fs);
            }



            lijstje.Shuffle();

            var testData  = lijstje.Take(lijstje.Count / 2).ToList();
            var trainData = lijstje.Skip(lijstje.Count / 2).ToList();


            foreach (var inp in INPUTS.INPUTSDICT)
            {
                state[inp.Key] = false;
            }

            state["x"] = true;
            state["y"] = true;
            //state["xTimesY"] = true;

            //var networkShape = new List<int>() { 2, 1, 1 };
            var networkShape = new List <int>()
            {
                2, 8, 8, 8, 8, 8, 8, 1
            };
            var inputIds = new List <string>()
            {
                "x", "y"
            };

            var network = NetworkBuilder.BuildNetwork(networkShape, Activations.TANH, Activations.TANH, null, inputIds, false);

            var w = Stopwatch.StartNew();

            for (int i = 0; i < 100000; i++)
            {
                foreach (var trainPoint in trainData)
                {
                    var input = MLHelper.ConstructInput(state, trainPoint.X, trainPoint.Y);
                    NetworkBuilder.ForwardProp(network, input);
                    NetworkBuilder.BackProp(network, trainPoint.Label, Errors.SQUARE);
                    if ((i + 1) % batchSize == 0)
                    {
                        NetworkBuilder.UpdateWeights(network, learningrate, regularizationRate);
                    }
                }
                lossTrain = MLHelper.GetLoss(network, state, trainData);
                lossTest  = MLHelper.GetLoss(network, state, testData);



                Console.WriteLine($"{i}: LossTrain: {lossTrain} LossTest: {lossTest}");


                if (w.Elapsed.TotalSeconds > 1)
                {
                    var img2 = MLImager.GenerateImage(network, state, size);
                    MLImager.AddPointsToImage(img2, lijstje);

                    try
                    {
                        using (var fs = new FileStream("output2.png", FileMode.Create, FileAccess.Write, FileShare.Read))
                        {
                            img2.SaveAsPng(fs);
                        }
                    }
                    catch (Exception ex)
                    {
                    }
                    w.Restart();
                }



                //for (int y = 1; y < network.Count; y++)
                //{
                //    var layer = network[y];
                //    Console.WriteLine(y);
                //    foreach (var node in layer)
                //    {
                //        var sb = new StringBuilder();
                //        foreach (var link in node.InputLinks)
                //        {
                //            sb.Append($"Lnk: {link.Weight} ");
                //        }
                //        Console.WriteLine($"   {sb.ToString()}");
                //    }
                //    Console.WriteLine();
                //}

                //double cccc = 0;
                //foreach (var testPoint in testData)
                //{
                //    var input = ConstructInput(testPoint.X, testPoint.Y);
                //    var result = NetworkBuilder.ForwardProp(network, input);

                //    var res = Math.Abs(result - testPoint.Label);
                //    cccc += res;
                //}
                //Console.WriteLine($"Res: {cccc}");
            }
        }