public void Train(double[] inputArray, double[] targetArray) { /*Random rnd = new Random(); * for (int i = 0; i < 10; ++i) * { * //wypełnianie macierzy c - centrów * int index = rnd.Next(0, inp.row); * for (int j = 0; j < 1; ++j) * { * centre.tab[i, j] = inp.tab[index, j]; * } * //wypełnianie macierzy r - zasięgu * range.tab[i, 0] = rnd.NextDouble() * 50; * }*/ //Matrix.Matrix inputMatrix = new Matrix.Matrix(inputArray); FillHiddenNeurons(inputArray); //hiddenOutput.DisplayMatrix(); Matrix.Matrix outputsOutput = outputWeights * hiddenOutput; Matrix.Matrix targetMatrix = new Matrix.Matrix(targetArray); Matrix.Matrix outputErrorsMatrix = targetMatrix - outputsOutput; mapMatrixLinearry(outputsOutput); //!!! do zmiany w wariancie 2 na normalne mapowanie Matrix.Matrix gradients_output = outputErrorsMatrix * learningRate; gradients_output.HadamardProduct(outputsOutput); //gradients_output.DisplayMatrix(); Matrix.Matrix hiddenTransposed = hiddenOutput.TransposeMatrix(); //hiddenTransposed.DisplayMatrix(); Matrix.Matrix outputs_deltas = gradients_output * hiddenTransposed; //outputs_deltas.DisplayMatrix(); outputWeights += outputs_deltas; //Console.WriteLine("outputWeights: "); //outputWeights.DisplayMatrix(); }
public void train(double[] inputArray, double[] targetArray) { Matrix.Matrix inputMatrix = new Matrix.Matrix(inputArray); // 3 x 1 Matrix.Matrix hiddenOutput = hiddenWeights * inputMatrix; if (useBias) { hiddenOutput += biasHidden; } activationFunction(hiddenOutput); //showHiddenOutputs(hiddenOutput); Matrix.Matrix outputsOutput = outputWeights * hiddenOutput; if (useBias) { outputsOutput += biasOutput; } activationFunction(outputsOutput); Matrix.Matrix targetMatrix = new Matrix.Matrix(targetArray); Matrix.Matrix outputErrorsMatrix = targetMatrix - outputsOutput; mapMatrix(outputsOutput); Matrix.Matrix gradients_output = outputErrorsMatrix * learningRate; gradients_output.HadamardProduct(outputsOutput); Matrix.Matrix hiddenTransposed = hiddenOutput.TransposeMatrix(); Matrix.Matrix outputs_deltas = gradients_output * hiddenTransposed; //momentumMatrixOutput += outputs_deltas; //momentumMatrixOutput *= momentumRate; outputWeights += outputs_deltas; //outputWeights += momentumMatrixOutput; biasOutput += gradients_output; //biasOutput += outputs_deltas; //hidden layer errors Matrix.Matrix outputWeights_transposed = outputWeights.TransposeMatrix(); Matrix.Matrix hiddenErrorsMatrix = outputWeights_transposed * outputErrorsMatrix; mapMatrix(hiddenOutput); Matrix.Matrix gradients_hidden = hiddenErrorsMatrix * learningRate; gradients_hidden.HadamardProduct(hiddenOutput); Matrix.Matrix hidden_deltas = gradients_hidden * inputMatrix.TransposeMatrix(); hiddenWeights += hidden_deltas; biasHidden += gradients_hidden; //biasHidden += hidden_deltas; //MOMENTUM outputWeights += momentumMatrixOutput; hiddenWeights += momentumMatrixHidden; biasOutput += momentumMatrixOutputBias; biasHidden += momentumMatrixHiddenBias; momentumMatrixOutput = outputs_deltas * momentumRate; momentumMatrixHidden = hidden_deltas * momentumRate; momentumMatrixOutputBias = gradients_output * momentumRate; momentumMatrixHiddenBias = gradients_hidden * momentumRate; }