public bool StopIterations(NeuralNetwork neuralNetwork, ProblemDescriptionModel neuralNetworkTrainModel) { var trainSetCount = Convert.ToInt32(Math.Floor(neuralNetworkTrainModel.ValuesCount * .66)); var validationSetCount = Convert.ToInt32(Math.Floor((neuralNetworkTrainModel.ValuesCount - trainSetCount) * .66)); var innerLastOutputDeviation = 0d; for (var i = trainSetCount; i < trainSetCount + validationSetCount; i++) { _feedForward.Compute(neuralNetwork, neuralNetworkTrainModel.GetInputValues(i)); innerLastOutputDeviation = Math.Max(innerLastOutputDeviation, _ouputDeviation.Compute(neuralNetwork, neuralNetworkTrainModel.GetOutputValues(i))); } //innerLastOutputDeviation /= validationSetCount; //check deviation to break training neuralNetwork.NeuralNetworkError = innerLastOutputDeviation; //check to stop cycles with this setup if (Math.Round(stopIterations_lasMaxtOutputDeviation, neuralNetwork.Divisor.ToString().Length) <= Math.Round(innerLastOutputDeviation, neuralNetwork.Divisor.ToString().Length) || //if important digits stopped correcting, stop iterations innerLastOutputDeviation < neuralNetworkTrainModel.AcceptedError || //if we are in the accepted error range, stop iterations Math.Abs(Math.Abs(stopIterations_lasMaxtOutputDeviation) - Math.Abs(innerLastOutputDeviation)) < 1 / (neuralNetwork.Divisor * 1000)) //if the correction is too small stop iterations { stopIterations_lasMaxtOutputDeviation = double.MaxValue; return(true); } stopIterations_lasMaxtOutputDeviation = innerLastOutputDeviation; return(false); }
public void Test(NeuralNetwork neuralNetwork, ProblemDescriptionModel neuralNetworkTrainModel) { var trainSetCount = Convert.ToInt32(Math.Floor(neuralNetworkTrainModel.ValuesCount * .66)); var validationSetCount = Convert.ToInt32(Math.Floor((neuralNetworkTrainModel.ValuesCount - trainSetCount) * .66)); var testSet = Convert.ToInt32(neuralNetworkTrainModel.ValuesCount - trainSetCount - validationSetCount); var testError = 0d; for (var i = trainSetCount + validationSetCount; i < trainSetCount + validationSetCount + testSet; i++) { _feedForward.Compute(neuralNetwork, neuralNetworkTrainModel.GetInputValues(i)); testError = Math.Max(testError, _ouputDeviation.Compute(neuralNetwork, neuralNetworkTrainModel.GetOutputValues(i))); } neuralNetwork.NeuralNetworkError = testError;// / testSet;//update with test error }
public bool StopTraining(NeuralNetwork neuralNetwork, ProblemDescriptionModel neuralNetworkTrainModel) { //iteration < neuralNetwork.HiddenNeurons.Count() || if (neuralNetworkTrainModel.AutoAdjuctHiddenLayer && neuralNetwork.NeuralNetworkError > neuralNetworkTrainModel.AcceptedError) { //reconfigure for up to ten times the sum of input/output neurons foreach (var layer in neuralNetwork.HiddenLayers) { if (layer.Count() >= (neuralNetwork.InputNeurons.Count() + neuralNetwork.OutputNeurons.Count()) * 10) { return(true); } } return(false); } return(true); }
public void Train(NeuralNetwork neuralNetwork, ProblemDescriptionModel neuralNetworkTrainModel) { var trainSetCount = Convert.ToInt32(Math.Floor(neuralNetworkTrainModel.ValuesCount * .66)); if (trainSetCount < neuralNetwork.InputNeurons.Count() + neuralNetwork.HiddenLayers.Sum(x => x.Count()) + neuralNetwork.OutputNeurons.Count()) { trainSetCount = neuralNetworkTrainModel.ValuesCount; } //var suffle = Suffle(0, trainSetCount); //foreach (var i in suffle) for (var i = 0; i < trainSetCount; i++) { _feedForward.Compute(neuralNetwork, neuralNetworkTrainModel.GetInputValues(i)); _backPropagate.Compute(neuralNetwork, neuralNetworkTrainModel.GetOutputValues(i)); } }
public ProblemDescriptionCreator() { neuralNetworkTrainModel = new ProblemDescriptionModel(); }