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>()); }