public void Run()
 {
     if (_ValidationDataTable == null)
     {
         throw new Exception("Validation Engine (ID = " + ID.ToString() + " cannot start training because TrainingDataTable is Empty/NULL/Invalid");
     }
     _MCCCalculator.Reset();
     for (patternIndex = 0; patternIndex < InputPatternCount; patternIndex++)
     {
         //Feed Farword
         patternRow = _ValidationDataTable.Rows[patternIndex];
         _RuntimeEngine.PatternRow = patternRow;
         y = _RuntimeEngine.Run();
         //Feed Backword
         //OutputLayer:- dpj=(Tpj-Ypj) Ypj (1-Ypj)
         t = float.Parse(patternRow[_OutputAttribute].ToString());
         predictionResult = _MCCCalculator.Update(t, y);
         _NeuralNetwork.RaiseTaskProgressEvent(this, 0.00f, "Validation result of pattern no. " + ((int)(patternIndex + 1)).ToString() + " is T = " + t.ToString() + " and Y = " + y.ToString() + " difference is: " + ((float)(t - y)).ToString() + " [" + predictionResult + "]");
     }
 }
Example #2
0
        public void Run()
        {
            if (TrainingDataTable == null)
            {
                throw new Exception("Training Engine (ID = " + ID.ToString() + " cannot start training because TrainingDataTable is Empty/NULL/Invalid");
            }
            _MCCCalculator.Reset();
            _TSSE = 0.00f;
            _RMSE = 0.00f;
            for (patternIndex = 0; patternIndex < InputPatternCount; patternIndex++)
            {
                //Feed Farword
                patternRow = _TrainingData.Rows[patternIndex];
                _RuntimeEngine.PatternRow = patternRow;
                y = _RuntimeEngine.Run();
                //Feed Backword
                //OutputLayer:- dpj=(Tpj-Ypj) Ypj (1-Ypj)
                t = float.Parse(patternRow[_OutputAttribute].ToString());
                _MCCCalculator.Update(t, y);
                error  = ((t - y) * y * (1 - y));
                neuron = _NeuralNetwork._OutputLayer._ListOfNeurons[0];
                _NeuronErrorDictionary[neuron.ID] = error;
                //Compute TSSE and RMSE
                _TSSE = _TSSE + ((t - y) * (t - y)) / 2;
                _RMSE = (float)Math.Sqrt((2 * _TSSE) / InputPatternCount);
                //HiddenLayer:- dpj= Ypj (1-Ypj) Sum(&pk Wkj); where &pk is the error post synaptic neuron k
                totalLayers = _NeuralNetwork._ListOfLayers.Count;
                for (hiddenLayerIndex = totalLayers - 2; hiddenLayerIndex > 0; hiddenLayerIndex--)
                {
                    layer        = _NeuralNetwork._ListOfLayers[hiddenLayerIndex];
                    totalNeurons = layer._ListOfNeurons.Count;
                    for (neuronIndex = 0; neuronIndex < totalNeurons; neuronIndex++)
                    {
                        neuron = layer._ListOfNeurons[neuronIndex];
                        y      = neuron._Value;

                        postSynapticErrorSignal = 0;
                        postLayer = _NeuralNetwork._ListOfLayers[hiddenLayerIndex + 1];
                        for (postSynapticNeuronIndex = 0; postSynapticNeuronIndex < postLayer._ListOfNeurons.Count; postSynapticNeuronIndex++)
                        {
                            postSynapticNeuron      = postLayer._ListOfNeurons[postSynapticNeuronIndex];
                            postSynapticNeuronError = _NeuronErrorDictionary[postSynapticNeuron.ID];
                            postSynapticConnection  = _NeuralNetwork._SourceTargetNeuronSynapticDictionary[neuron.ID.ToString() + "-" + postSynapticNeuron.ID.ToString()];
                            postSynapticErrorSignal = postSynapticErrorSignal + (postSynapticNeuronError * postSynapticConnection._Weight);
                        }
                        error = y * (1 - y) * postSynapticErrorSignal;
                        _NeuronErrorDictionary[neuron.ID] = error;
                    }
                }
                //Change Weights
                for (synapticIndex = 0; synapticIndex < _NeuralNetwork._ListOfSynapticConnections.Count; synapticIndex++)
                {
                    synaptic         = _NeuralNetwork._ListOfSynapticConnections[synapticIndex];
                    deltaWeight      = synaptic._SourceNeuron._Value * _NeuronErrorDictionary[synaptic._TargetNeuron.ID] * _NeuralNetwork._LearningRate;
                    synaptic._Weight = synaptic._Weight + deltaWeight + (_Momentum * _PreviousWeightDictionary[synaptic.ID]);
                    _PreviousWeightDictionary[synaptic.ID] = deltaWeight;
                }
                //Progress report
                // _NeuralNetwork.RaiseTaskProgressEvent(this ,((((float)(patternIndex + 1)) / ((float)(InputPatternCount))) * 100) ,"Training Engine Learning Pattern No: " + patternIndex.ToString() + " of " + InputPatternCount.ToString());
            }
        }