Не работает нейронка 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


Ответы (0 шт):