Example #1
0
        private void listBoxCalculator_SelectedIndexChanged(object sender, EventArgs e)
        {
            try {
                double bias = double.Parse(textBoxComparePrecision.Text);
                switch (listBoxCalculator.SelectedIndex)
                {
                case 0:
                    _accuracyCalculator = new AccuracyCalculatorDecart(bias);
                    break;

                case 1:
                    _accuracyCalculator = new AccuracyCalculatorSimpleBiasABSEqual(bias);
                    break;

                case 2:
                    _accuracyCalculator = new AccuracyCalculatorSimpleMedianBiasEqual(bias);
                    break;
                }
            } catch (Exception exception) {
                MessageBox.Show(exception.Message);
            }
        }
        /// <summary>
        /// returns % of right recognized samples
        /// </summary>
        /// <param name="_samples">without bias "1"</param>
        /// <param name="_answers">without bias "1"</param>
        /// <param name="_calculator"></param>
        /// <returns></returns>
        public double getAccuracy(Matrix _samples, Matrix _answers, IAccuracyCalculator _calculator)
        {
            if (_samples == null)
            {
                throw new ArgumentNullException(nameof(_samples));
            }
            if (_answers == null)
            {
                throw new ArgumentNullException(nameof(_answers));
            }
            if (_calculator == null)
            {
                throw new ArgumentNullException(nameof(_calculator));
            }

            //adding first "1" in samples and answers for algoritm
            Matrix samples1 = _samples.ComposeAddRow(new Matrix(1, _samples.Columns, 1), 0);
            Matrix answers1 = _answers.ComposeAddRow(new Matrix(1, _answers.Columns, 1), 0);

            Matrix outcome = ForvardPropagation(samples1);

            return(_calculator.Calculate(outcome, answers1));
        }
        /// <summary>
        /// train neoronet, returns accuracy on each epoh
        /// </summary>
        /// <param name="_samples">doesn't contain first 1 for bias</param>
        /// <param name="_answers">doesn't contain first 1 for bias</param>
        /// <param name="_batchSize"></param>
        /// <param name="_maxIteration"></param>
        /// <param name="_accuracy">% of recognized samples, 0..1</param>
        /// <param name="_testSamples">doesn't contain first 1 for bias</param>
        /// <param name="_testAnswers">doesn't contain first 1 for bias</param>
        /// <param name="_accuracyCalculator">for testing accuracy</param>
        /// <param name="_savingPath">path for saving good nets</param>
        /// <returns></returns>
        public double[] train(Matrix _samples, Matrix _answers, int _batchSize, int _maxIteration, double _accuracy, Matrix _testSamples, Matrix _testAnswers, IAccuracyCalculator _accuracyCalculator, string _savingPath)
        {
            if (_samples == null)
            {
                throw new ArgumentNullException(nameof(_samples));
            }
            if (_answers == null)
            {
                throw new ArgumentNullException(nameof(_answers));
            }
            if (_testSamples == null)
            {
                throw new ArgumentNullException(nameof(_testSamples));
            }
            if (_testAnswers == null)
            {
                throw new ArgumentNullException(nameof(_testAnswers));
            }
            if (_accuracyCalculator == null)
            {
                throw new ArgumentNullException(nameof(_accuracyCalculator));
            }
            if (_samples.Columns != _answers.Columns)
            {
                throw new Exception("samples doesn't fit to answers");
            }
            if (_batchSize <= 0 || _batchSize > _samples.Columns)
            {
                throw new ArgumentOutOfRangeException(nameof(_batchSize));
            }
            if (_maxIteration <= 0)
            {
                throw new ArgumentOutOfRangeException(nameof(_maxIteration));
            }
            if (_accuracy < 0 || _accuracy > 1)
            {
                throw new ArgumentOutOfRangeException(nameof(_accuracy));
            }

            //adding first "1" in samples and answers for algoritm
            Matrix samples1 = _samples.ComposeAddRow(new Matrix(1, _samples.Columns, 1), 0);
            Matrix answers1 = _answers.ComposeAddRow(new Matrix(1, _answers.Columns, 1), 0);

            //вибір даних з самплес в батч
            List <KeyValuePair <Matrix, Matrix> > batches = new List <KeyValuePair <Matrix, Matrix> >(); //batches (KVP<samples,answers>)

            if (samples1.Columns / _batchSize == 0 && samples1.Columns % _batchSize == 0)
            {
                batches.Add(new KeyValuePair <Matrix, Matrix>(samples1, answers1));
            }
            else
            {
                for (int i = 0; i < samples1.Columns / _batchSize; i++)
                {
                    batches.Add(new KeyValuePair <Matrix, Matrix>(samples1.Submatrix(0, samples1.Rows - 1, i * _batchSize, (i + 1) * _batchSize - 1),
                                                                  answers1.Submatrix(0, answers1.Rows - 1, i * _batchSize, (i + 1) * _batchSize - 1)));
                }

                if (samples1.Columns % _batchSize != 0)
                {
                    batches.Add(
                        new KeyValuePair <Matrix, Matrix>(
                            samples1.Submatrix(0, samples1.Rows - 1, samples1.Columns / _batchSize * _batchSize, samples1.Columns - 1),
                            answers1.Submatrix(0, answers1.Rows - 1, answers1.Columns / _batchSize * _batchSize, samples1.Columns - 1)));
                }
            }
            //train
            List <double> rez = new List <double>();
            double        curAccur;

            for (int i = 0; i < _maxIteration; i++)
            {
                for (int j = 0; j < batches.Count; j++)
                {
                    BackPropagation(batches[j].Key, batches[j].Value);
                }
                curAccur = getAccuracy(_testSamples, _testAnswers, _accuracyCalculator);
                rez.Add(curAccur);
                if (curAccur > _accuracy)
                {
                    break;
                }

                if (curAccur > _minAccurToSave)
                {
                    this.save(_savingPath + "\\" + curAccur + " " + DateTime.Now.Minute + DateTime.Now.Second + DateTime.Now.Ticks);
                    _minAccurToSave = curAccur;
                }
            }
            return(rez.ToArray <double>());
        }