Esempio n. 1
0
        /// <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());
        }
Esempio n. 2
0
        /// <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);
        }