Проблема с обучением нейронной сети. конфигурация 16384-512-128-128-42

Возникла проблема с обучение нейронной сети (перцептрон).Пробовал другие конфигурации - не получается. Обучаю на базе NIST Special Database 19 second edition(384000 картинок).Там картинки 128 на 128 пикселей, предварительно перевел в csv формат. Во время обучения подаю рандомные картинки из базы, также использую DropOut с вероятность 20 процентов. Внизу прикрепил свою функцию BackPropogation и WeightUpdater. Важно, что до перехода на новую базу, сеть обучалась на данных в формате 28 на 28 пикселей.И все было отлично, отгадывала примерно 95 процентов букв. А как только перешел на 128 на 128, произошла такая проблема. Learning rate равен 0.01*0.01^(x/20) где х это эпоха. Также есть закономерность в отгадывании(фото прикреплено)слева ответ нейронки, справа правильный ответ. Может кто нибудь поможет? очень нужна помощь[![` введите сюда описание изображения

void Network::BackPropogation(double predict)
{
    for (int i = 0; i < neurons_on_layer[layers - 1]; i++) {
        if (i != predict)
            error_of_neurons[layers - 1][i] = -neurons[layers - 1][i] * function.ModReluDerivate(neurons[layers - 1][i]);
        else
            error_of_neurons[layers - 1][i] = (1.0 - neurons[layers - 1][i]) * function.ModReluDerivate(neurons[layers - 1][i]);
    }
    for (int k = layers - 2; k > 0; k--) {
        Matrix::MultiTrans(weight[k], error_of_neurons[k + 1], error_of_neurons[k], neurons_on_layer[k + 1]);
        for (int j = 0; j < neurons_on_layer[k]; j++)
            error_of_neurons[k][j] *= function.ModReluDerivate(neurons[k][j]);
    }
}
void Network::WeightsUpdater(double learning_rate) {
    for (int i = 0; i < layers - 1; ++i) {
        for (int j = 0; j < neurons_on_layer[i + 1]; ++j) {
            for (int k = 0; k < neurons_on_layer[i]; ++k) {
                weight[i].GetElement(j, k) += neurons[i][k] * error_of_neurons[i + 1][j] * learning_rate;
            }
        }
    }
    for (int i = 0; i < layers - 1; i++) {
        for (int k = 0; k < neurons_on_layer[i + 1]; k++) {
            bias_weight[i][k] += error_of_neurons[i + 1][k] * learning_rate;
        }
    }
}

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