/// <summary> /// Wykonuje algorytm feedforwardu dla sieci neuronowej czyli sieć dostaje inputy i zwraca output taki jaki myśli że by był. /// </summary> /// <param name="inputs">Inputy dla sieci neuronowej.</param> /// <returns>Zwraca output jaki sieć neuronowa myśli że by był dla podanych inputów.</returns> public float[] Feedforward(float[] inputs) { if (inputs.Length != InputsLayerSize) { throw new ArgumentException("Liczba inputów jest nieprawidłowa z liczbą inputów jaką przyjmuje sieć neuronowa."); } Matrix mInputs = Matrix.Transpose(Matrix.FromOneDimensionArray(inputs)); Matrix hiddenOutput = Matrix.Multiply(weightsIh, mInputs); if (AddBias) { hiddenOutput.Add(biasH); } hiddenOutput.Foreach((f) => HiddenLayerActivationFunction.Invoke(f)); Matrix outputOutput = Matrix.Multiply(weightsHo, hiddenOutput); if (AddBias) { outputOutput.Add(biasO); } outputOutput.Foreach((f) => OutputLayerActivationFunction.Invoke(f)); return(outputOutput.ToOneDimensionArray()); }
/// <summary> /// Wykonuje algorytm wstecznej propagacji błędów dla sieci neuronowej. /// </summary> /// <param name="inputs">Inputy.</param> /// <param name="answers">Poprawne outputy.</param> public void Backpropagation(float[] inputs, float[] answers) { if (inputs.Length != InputsLayerSize) { throw new ArgumentException("Liczba inputów jest nieprawidłowa z liczbą inputów jaką przyjmuje sieć neuronowa."); } if (answers.Length != OutputsLayerSize) { throw new ArgumentException("Liczba odpowiedzi jest nieprawidłowa z liczbą outputów sieci neuronowej."); } Matrix mInputs = Matrix.Transpose(Matrix.FromOneDimensionArray(inputs)); Matrix mAnswers = Matrix.Transpose(Matrix.FromOneDimensionArray(answers)); Matrix hiddenOutput = Matrix.Multiply(weightsIh, mInputs); if (AddBias) { hiddenOutput.Add(biasH); } hiddenOutput.Foreach((f) => HiddenLayerActivationFunction.Invoke(f)); Matrix outputOutput = Matrix.Multiply(weightsHo, hiddenOutput); if (AddBias) { outputOutput.Add(biasO); } outputOutput.Foreach((f) => OutputLayerActivationFunction.Invoke(f)); Matrix outputError = Matrix.Subtract(mAnswers, outputOutput); Matrix tWeightsHo = Matrix.Transpose(weightsHo); Matrix hiddenError = Matrix.Multiply(tWeightsHo, outputError); Matrix gradientOutput = Matrix.Foreach(outputOutput, OutputLayerDerivativeFunction); gradientOutput.Multiply(outputError); gradientOutput.Multiply(LearningRate); Matrix gradientHidden = Matrix.Foreach(hiddenOutput, HiddenLayerDerivativeFunction); gradientHidden.Multiply(hiddenError); gradientHidden.Multiply(LearningRate); Matrix tHiddenOutput = Matrix.Transpose(hiddenOutput); Matrix deltaWeightsHo = Matrix.Multiply(gradientOutput, tHiddenOutput); weightsHo.Add(deltaWeightsHo); Matrix tInputs = Matrix.Transpose(mInputs); Matrix deltaWeightsIh = Matrix.Multiply(gradientHidden, tInputs); weightsIh.Add(deltaWeightsIh); }