Не работает нейронка C#
Я делал нейронку по распознаванию картинок с рукописными цифрами 28х28 пикселей на C#. В функцию, которая засовывает значения массива во входные нейроны и потом все считает (TestNeuralNetwork), передается информация о яркости каждого пикселя на картинке от 0 до 1. Вот примеры картинок:

Картинки по-быстрому для теста нарисованы в пеинте.
Значения из массива о яркости задаются в значения каждому входному нейрону, и потом все умножается на веса и т.п.. Вот код как все делается:
private void RecalculateResult()
{
// ziro layer with first input neurons - перемножается нулевой слой скрытых нейронов на входные.
for (int hidden = 0; hidden < HiddenNeurons[0].Length; hidden++)
{
HiddenNeurons[0][hidden].value = 0;
for (int input = 0; input < InputNeurons.Length; input++)
{
HiddenNeurons[0][hidden].value += HiddenNeurons[0][hidden].weights[input] * InputNeurons[input].value;
}
}
// remaining layers of hidden neurons - перемножается от первого слоя до последнего
for (int layer = 1; layer < HiddenNeurons.Length; layer++)
{
for (int hidden = 0; hidden < HiddenNeurons[layer].Length; hidden++)
{
HiddenNeurons[layer][hidden].value = 0;
for (int prevHidden = 0; prevHidden < HiddenNeurons[layer-1].Length; prevHidden++)
{
HiddenNeurons[layer][hidden].value += HiddenNeurons[layer][hidden].weights[prevHidden] * HiddenNeurons[layer-1][prevHidden].value;
}
}
}
// output neurons calculate - перемножаются веса выходных с последними скрытыми.
for (int output = 0; output < OutputNeurons.Length; output++)
{
OutputNeurons[output].value = 0;
for (int lastHidden = 0; lastHidden < HiddenNeurons[HiddenNeurons.Length-1].Length; lastHidden++)
{
OutputNeurons[output].value += OutputNeurons[output].weights[lastHidden] * HiddenNeurons[HiddenNeurons.Length-1][lastHidden].value;
}
}
}
InputNeurons, HiddenNeurons и OutputNeurons - это все массивы которые содержат в себе экземпляры классов:
public class InputNeuron
{
public double value;
public InputNeuron(double value)
{
this.value = value;
}
}
public class HiddenNeuron
{
public double value;
public double[] weights;
public HiddenNeuron(double[] weights)
{
this.weights = weights;
}
}
public class OutputNeuron
{
public double value;
public double[] weights;
public string association;
public OutputNeuron(double[] weights, string association)
{
this.weights = weights;
this.association = association;
}
}
HiddenNeurons - многомерный массив т.к. может быть несколько скрытых слоёв.
Входные нейроны задаются правильно, я это проверил в дебаге. Но, где здесь ошибка при которой постоянно на выходе побеждает один и тот же выходной нейрон?
Кому нужно, вот целый проект решения Visual Studio на гитхабе:GitHub