Мое обратное распространение производит полный мусор - PullRequest
0 голосов
/ 16 мая 2018

Я - любитель и, следовательно, не имею большого опыта работы с нейронными сетями, это моя первая попытка реализовать ее. Моя функция обратного распространения что-то делает, но не то, что она должна делать. Сеть не становится лучше на том, на чем я тренируюсь (после примерно 10000 примеров обучения). Реализации из Интернета работают над этой проблемой, поэтому в этом коде должно быть что-то.

void backprop(std::vector<std::vector<neuron>>& neuronen, std::vector<std::vector<std::vector<weight>>>& weights, int rlayer, std::vector<float> target, float learnrate) {
    for (int i = 0; i < weights[rlayer].size(); i++) {
        for (int j = 0; j < weights[rlayer][i].size(); j++) {
            weights[rlayer][i][j].changeweight(weights[rlayer][i][j].weightout() +  (learnrate * (target[i] - neuronen[rlayer][i].actout()) * actfAbl(neuronen[rlayer][i].zout()) * neuronen[rlayer - 1][j].actout())); 
        }
    }

    if (rlayer > 1) {
        std::vector<float> newtarget;

        for (int i = 0; i < neuronen[rlayer - 1].size(); i++) {
            float dzdol1 = 0;
            for (int j = 0; j < neuronen[rlayer].size(); j++) {
                dzdol1 = weights[rlayer][j][i].weightout() * actfAbl(neuronen[rlayer][j].zout() * (2 * neuronen[rlayer][j].actout() - target[j]));
            }
            std::cout << "dzdol1: " << dzdol1 << std::endl;
            newtarget.push_back(dzdol1);
        }
        backprop(neuronen, weights, rlayer - 1, newtarget, learnrate);
    }
    return;
}

Заранее спасибо

...