Ошибка в реализации метода "backpropagation

242
10 ноября 2017, 09:50

Доброе времени суток!

Правильно ли я написан метод "backpropagation"? Мне некорректно считает считает веса для нейронов.

Переменные:

int inputs[3];//входные нейроны
double hidN[2];//нейроны скрытого слоя
double output;//выходной нейрон

double weight_1[3][2], weight_1_2[3][2];// веса для скрытого слоя
double weight_2[2], weight_2_2[2];//веса для выходного нейрона
double actual_predict;// актуальное предсказание 
double learning_rate;// равен 0.08

double error_layer_2, gradient_layer_2, weights_delta_layer_2;
double error_layer_1[2], gradient_layer_1[2], weights_delta_layer_1[2];

Реализация:

void train(double expected_predict)
    {
        // делает предсказание 
        for (int i = 0; i < 2; i++)
            hidN[i] = sigmoid((inputs[0] * weight_1[0][i]) + (inputs[1] * weight_1[1][i]) + (inputs[2] * weight_1[2][i]));
        output = sigmoid((hidN[0] * weight_2[0]) + (hidN[1] * weight_2[1]));
        actual_predict = output;
        //корректирует веса для весов скрытого слоя(hidN)
        error_layer_2 = actual_predict - expected_predict;
        gradient_layer_2 = actual_predict*(1 - actual_predict);
        weights_delta_layer_2 = error_layer_2 * gradient_layer_2;
        for (int i = 0; i < 2; i++)// скорее всего здесь ошибка(
            weight_2[i] = weight_2[i] - hidN[i] * weights_delta_layer_2 * learning_rate;
        // корректирует веса для входных нейронов (inputs)
        for (int i = 0; i < 2; i++)
        {
            error_layer_1[i] = weights_delta_layer_2 * weight_2[i];
            gradient_layer_1[i] = hidN[i] * (1 - hidN[i]);
            weights_delta_layer_1[i] = error_layer_1[i] * gradient_layer_1[i];
        }
        for (int i = 0; i < 3; i++)//или здесь 
            for (int j = 0; j < 2; j++)
                weight_1[i][j] = weight_1_2[i][j] - inputs[i] * weights_delta_layer_1[j] * learning_rate;

    }

Источник алгоритма: https://www.youtube.com/watch?v=HA-F6cZPvrg

Вопрос с полным кодом: Не могу правильно реализовать метод обратного распространения ошибки

Answer 1

Код с ошибкой:

weight_1[i][j] = weight_1_2[i][j] - inputs[i] * weights_delta_layer_1[j] * learning_rate;

Код без ошибки:

weight_1[i][j] = weight_1[i][j] - inputs[i] * weights_delta_layer_1[j] * learning_rate;
READ ALSO
Неверная линковка проекта в Qt + msvc2010

Неверная линковка проекта в Qt + msvc2010

Поддерживаю один проект, он используется в виде сервиса windows, реализован при помощи Qt ( класс QtService и пр) Перекидываю из папки bin установленного...

400
Геометрия.Площади [требует правки]

Геометрия.Площади [требует правки]

Ребят,прошу ответить на вопрос: формула площади (допустим треугольника ) через длины векторовФормулу Герона в мусорку, это для слабаков

353
Что означает эта запись? [требует правки]

Что означает эта запись? [требует правки]

Каким образом работает эта функция сравнения? Что значит (int*)?

241
unresolved external symbol __RTC *

unresolved external symbol __RTC *

Опишите возможные причины проблемы линковки:

277