internal static float[] GetDeltasHiddenLayer(float[] outputSignals, float[][] weightsNextLayer, float[] deltasErrorsNextLayer, ActivationFunc activationFunc) { int _neuronsCountThisLayer = outputSignals.Length; int _neuronsCountNextLayer = deltasErrorsNextLayer.Length; float[] _deltasErrors = new float[outputSignals.Length]; float _sumWeightsAndDeltasNextLayer; float _derivativeActivFunc; for (int _neuron = 0; _neuron < _neuronsCountThisLayer; _neuron++) { _sumWeightsAndDeltasNextLayer = GetSumWeightsAndDeltasNextLayer(_neuron); _derivativeActivFunc = NeuralMath.GetDerivativeByFunction(outputSignals[_neuron], activationFunc); _deltasErrors[_neuron] = _sumWeightsAndDeltasNextLayer * _derivativeActivFunc; } return(_deltasErrors); float GetSumWeightsAndDeltasNextLayer(int neuronPrevLayer) { float _sumWeightsAndDeltas = 0; for (int _neuronNextLayer = 0; _neuronNextLayer < _neuronsCountNextLayer; _neuronNextLayer++) { _sumWeightsAndDeltas += deltasErrorsNextLayer[_neuronNextLayer] * weightsNextLayer[neuronPrevLayer][_neuronNextLayer]; } return(_sumWeightsAndDeltas); } }
internal static float[] GetDeltasOutputLayer(float[] outputSignals, float[] expectedSignals, ActivationFunc activationFunc) { int _neuronsCountThisLayer = outputSignals.Length; float[] _deltasErrors = new float[_neuronsCountThisLayer]; float _errorOutSignal; float _derivativeActivFunc; for (int _neuron = 0; _neuron < _neuronsCountThisLayer; _neuron++) { _errorOutSignal = expectedSignals[_neuron] - outputSignals[_neuron]; _derivativeActivFunc = NeuralMath.GetDerivativeByFunction(outputSignals[_neuron], activationFunc); _deltasErrors[_neuron] = _errorOutSignal * _derivativeActivFunc; } return(_deltasErrors); }