Общие комментарии кодирования:
initializeWeights(-1.0, 1.0);
может не получить начальные значения, которые вы ожидали.
initializeWeights, вероятно, должен иметь:
inputWeights[i][j] = Math.random() * (pos - neg) + neg;
// ...
hiddenWeights[i] = (Math.random() * (pos - neg)) + neg;
вместо:
Math.random() - pos;
чтобы это работало:
initializeWeights(0.0, 1.0);
и дает вам начальные значения от 0,0 до 1,0, а не от -1,0 до 0,0.
lastDelta
используется до того, как объявлено:
deltaHiddenWeights[i] = learningRate * outputError * hiddenActivation[i] + (momentum * lastDelta);
Я не уверен, нужны ли + 1
на numInputs + 1
и numHiddenNeurons + 1
.
Не забудьте следить за округлением целых: 5/2 = 2, а не 2,5!
Вместо этого используйте 5.0 / 2.0. В общем случае добавьте .0 в ваш код, когда результат должен быть двойным.
Самое главное, вы достаточно долго обучали NeuralNet?
Попробуйте запустить его с numInputs = 2, numHiddenNeurons = 4, learningRate = 0,9 и тренироваться 1000 или 10000 раз.
Использование numHiddenNeurons = 2 иногда приводит к зависанию при попытке решить проблему XOR.
См. Также Проблема XOR - симуляция