/// <summary> /// Рассчёт обратного распространения ошибки в случае, если слой - последний /// </summary> /// <param name="learnSpeed">коэффициент скорости обучения</param> /// <param name="alfa">инерционный момент</param> /// <param name="targetVector">ожидаемый векор выходных значений</param> /// <param name="input">вектор входных сигналов из предыдущего слоя</param> /// <param name="isNewEpoch">новая эпоха обучения?</param> public void SolveBackPropagationLastLayer(double learnSpeed, double alfa, double[] targetVector, double[] inputWithoutBias, bool isNewEpoch) { double[] input = InputWithBias(inputWithoutBias); double[,] deltaWThisEra = new double[neuronsCount, inputCount]; // дельты новой эпохи for (int i = 0; i < neuronsCount; i++) // нейрон { localGrad[i] = (targetVector[i] - OUT[i]) * activationFunc.SolveDerivative(localField[i]); for (int j = 0; j < inputCount; j++) // дендриты i-го нейрона { deltaWThisEra[i, j] = alfa * deltaW[i, j] + learnSpeed * localGrad[i] * input[j]; // weights[i, j] += deltaWThisEra[i, j]; } } if (isNewEpoch) { deltaW = deltaWThisEra; } }