public bool Training_Loop(Regression training_data, int step_size = 1, int batch_size = 128)
        {
            if (step_size <= 0 || batch_size <= 0)
            {
                return(false);
            }

            if (batch_size > training_data.Length)
            {
                batch_size = training_data.Length;
            }

            for (int s = 0; s < step_size; s++)
            {
                if (!infinite_loop)
                {
                    if (circle >= max_circle)
                    {
                        return(false);
                    }
                }

                if (!ignore_error)
                {
                    if (total_error <= error_limit)
                    {
                        return(false);
                    }
                }

                total_error = 0f;

                var batch_counter = 0;
                var batch_limit   = batch_size;
                while (batch_counter < training_data.Length)
                {
                    var batch_regression = new Regression();
                    for (var i = batch_counter; i < batch_limit && i < training_data.Length; i++)
                    {
                        batch_regression.Add(training_data.inputs[i], training_data.outputs[i]);
                    }

                    var len = batch_regression.Length;
                    for (var i = 0; i < len; i++)
                    {
                        Training(batch_regression.inputs[i], batch_regression.outputs[i]);
                        total_error += GetError();
                    }
                    batch_counter += batch_size;
                    batch_limit   += batch_size;
                }

                circle++;
            }
            return(true);
        }
示例#2
0
        private void LoadFittedCurve()
        {
            if (Points.Count > 0 && _fittedCurve != null)
            {
                Regression.Clear();
                var result = _fittedCurve.CalcFit(Points.ToList());
                result.Points.ForEach(x => Regression.Add(x));

                Title    = result.Title;
                SubTitle = $"A : {result.A} , B : {result.B} , R : {result.R}";
            }
        }
        public void Training(Regression training_data, int batch_size = 128)
        {
            if (batch_size <= 0)
            {
                return;
            }
            if (batch_size > training_data.Length)
            {
                batch_size = training_data.Length;
            }

            circle = 0;
            do
            {
                total_error = 0f;

                var batch_counter = 0;
                var batch_limit   = batch_size;
                while (batch_counter < training_data.Length)
                {
                    var batch_regression = new Regression();
                    for (var i = batch_counter; i < batch_limit && i < training_data.Length; i++)
                    {
                        batch_regression.Add(training_data.inputs[i], training_data.outputs[i]);
                    }

                    var len = batch_regression.Length;
                    for (var i = 0; i < len; i++)
                    {
                        Training(batch_regression.inputs[i], batch_regression.outputs[i]);
                        total_error += GetError();
                    }
                    batch_counter += batch_size;
                    batch_limit   += batch_size;
                    batch_regression.Dispose();
                }

                if (!infinite_loop)
                {
                    if (circle >= max_circle)
                    {
                        break;
                    }
                }
                circle++;
            } while (!ignore_error && (total_error >= error_limit));
        }
        public void Training(Classification trainingData)
        {
            Regression regressionTrainingData = new Regression();

            for (int i = 0; i < trainingData.Length; i++)
            {
                float[] outputs = new float[output_layer.Length];
                for (int j = 0; j < outputs.Length; j++)
                {
                    if (trainingData.tags[i].Equals(output_layer[j].tag))
                    {
                        outputs[j] = 1f;
                    }
                    else
                    {
                        outputs[j] = 0f;
                    }
                }
                regressionTrainingData.Add(trainingData.inputs[i], outputs);
            }
            Training(regressionTrainingData);
        }
示例#5
0
        private void PictureBoxPoster_MouseUp(object sender, MouseEventArgs e)
        {
            toggleMove = false;
            PictureBox pictureBox = (PictureBox)sender;
            bool       train      = false;
            float      value      = 0f;

            if (pictureBox.Location.X >= (this.Width - (this.Width * padding)))
            {
                value      = 1f;
                train      = true;
                existRight = true;
            }
            else if (pictureBox.Location.X <= (this.Width * padding - size.Width))
            {
                value     = 0f;
                train     = true;
                existLeft = true;
            }
            else if (trainingData.Length > 0 && (existLeft && existRight))
            {
                pictureBox.Location = new Point(lastPoint.X, pictureBox.Location.Y);
                pictureBox.BringToFront();
            }

            if (train)
            {
                string[] split = linesList[int.Parse(pictureBox.Tag.ToString())].Split(' ');

                int   day   = int.Parse(split[1]) - 1;
                int   month = months.IndexOf(split[2]);
                float year  = Map.Float(0f, float.Parse(split[3]), 9999f, 0f, 1f);

                List <float> inputs = new List <float>();
                for (int i = 0; i < 31; i++)
                {
                    if (i == day)
                    {
                        inputs.Add(1f);
                    }
                    else
                    {
                        inputs.Add(0f);
                    }
                }

                for (int i = 0; i < 12; i++)
                {
                    if (i == month)
                    {
                        inputs.Add(1f);
                    }
                    else
                    {
                        inputs.Add(0f);
                    }
                }
                inputs.Add(year);

                string[] categoriesArr = split[4].Split(',');
                for (int i = 0; i < categories.Count; i++)
                {
                    bool exist = false;
                    for (int j = 0; j < categoriesArr.Length; j++)
                    {
                        if (categories[i] == categoriesArr[j])
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (exist)
                    {
                        inputs.Add(1f);
                    }
                    else
                    {
                        inputs.Add(0f);
                    }
                }

                string[] directorsArr = split[5].Split(',');
                for (int i = 0; i < directors.Count; i++)
                {
                    bool exist = false;
                    for (int j = 0; j < directorsArr.Length; j++)
                    {
                        if (directors[i] == directorsArr[j])
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (exist)
                    {
                        inputs.Add(1f);
                    }
                    else
                    {
                        inputs.Add(0f);
                    }
                }

                string[] starsArr = split[6].Split(',');
                for (int i = 0; i < stars.Count; i++)
                {
                    bool exist = false;
                    for (int j = 0; j < starsArr.Length; j++)
                    {
                        if (stars[i] == starsArr[j])
                        {
                            exist = true;
                            break;
                        }
                    }
                    if (exist)
                    {
                        inputs.Add(1f);
                    }
                    else
                    {
                        inputs.Add(0f);
                    }
                }

                trainingData.Add(inputs.ToArray(), new[] { value });
                stopwatch.Start();
                neuralNetwork.Training(trainingData);
                stopwatch.Stop();
                Console.WriteLine("Training : " + stopwatch.ElapsedMilliseconds);
                stopwatch.Reset();

                pictureBox.MouseDown -= PictureBoxPoster_MouseDown;
                pictureBox.MouseUp   -= PictureBoxPoster_MouseUp;
                pictureBox.MouseMove -= PictureBoxPoster_MouseMove;

                pictureBoxes.Remove(pictureBox);

                if (existLeft && existRight)
                {
                    for (int i = 0; i < pictureBoxes.Count; i++)
                    {
                        split = linesList[int.Parse(pictureBoxes[i].Tag.ToString())].Split(' ');

                        day   = int.Parse(split[1]) - 1;
                        month = months.IndexOf(split[2]);
                        year  = Map.Float(1f, float.Parse(split[3]), 9999f, 0f, 1f);

                        inputs = new List <float>();
                        for (int j = 0; j < 31; j++)
                        {
                            if (j == day)
                            {
                                inputs.Add(1f);
                            }
                            else
                            {
                                inputs.Add(0f);
                            }
                        }

                        for (int j = 0; j < 12; j++)
                        {
                            if (j == month)
                            {
                                inputs.Add(1f);
                            }
                            else
                            {
                                inputs.Add(0f);
                            }
                        }
                        inputs.Add(year);

                        categoriesArr = split[4].Split(',');
                        for (int j = 0; j < categories.Count; j++)
                        {
                            bool exist = false;
                            for (int z = 0; z < categoriesArr.Length; z++)
                            {
                                if (categories[j] == categoriesArr[z])
                                {
                                    exist = true;
                                    break;
                                }
                            }
                            if (exist)
                            {
                                inputs.Add(1f);
                            }
                            else
                            {
                                inputs.Add(0f);
                            }
                        }

                        directorsArr = split[5].Split(',');
                        for (int j = 0; j < directors.Count; j++)
                        {
                            bool exist = false;
                            for (int z = 0; z < directorsArr.Length; z++)
                            {
                                if (directors[j] == directorsArr[z])
                                {
                                    exist = true;
                                    break;
                                }
                            }
                            if (exist)
                            {
                                inputs.Add(1f);
                            }
                            else
                            {
                                inputs.Add(0f);
                            }
                        }

                        starsArr = split[6].Split(',');
                        for (int j = 0; j < stars.Count; j++)
                        {
                            bool exist = false;
                            for (int z = 0; z < starsArr.Length; z++)
                            {
                                if (stars[j] == starsArr[z])
                                {
                                    exist = true;
                                    break;
                                }
                            }
                            if (exist)
                            {
                                inputs.Add(1f);
                            }
                            else
                            {
                                inputs.Add(0f);
                            }
                        }

                        stopwatch.Start();
                        Result[] guesses = neuralNetwork.Predict(inputs.ToArray());
                        stopwatch.Stop();
                        Console.WriteLine("Predict:" + stopwatch.ElapsedMilliseconds);
                        stopwatch.Reset();

                        pictureBoxes[i].Location = new Point((int)Map.Float(0f,
                                                                            guesses[0].value,
                                                                            1f,
                                                                            this.Width * padding,
                                                                            this.Width - (this.Width * padding) - size.Width),
                                                             (int)RandomF.NextFloat(this.Height - size.Height));
                    }
                }
            }
        }