Функция регулировки веса в обратном направлении не работает - PullRequest
0 голосов
/ 01 мая 2019

Я создаю нейронную сеть, используя функцию активации сигмоида, и моя функция регулировки веса не работает.Веса случайным образом инициализируются от -1 до 1, и когда сеть обучается, значения выходят за пределы диапазона.

Веса хранятся в матрице смежности, и каждый вес корректируется с помощью цикла, и эту формулу дал мне мой профессоррассчитать изменение веса (deltaW).Когда deltaW был добавлен к текущему весу, я попытался сделать его отрицательным, потому что мой профессор предложил попробовать это, но такой удачи не было.Я протестировал все остальные функции, и они работают нормально, поэтому моя проблема должна лежать здесь.

void adjustWeights(struct neuralNetwork* network_ptr, struct dataSet data){
    float stepsize = 0.1,
        summation = 0,
        deltaW = 0;

    for(int i=0; i<2; i++){//adjust weights between intermediate and output
        for(int j=0; j<3; j++){
           deltaW =stepsize*(network_ptr->outputNodes[i] - data.target[i]) * network_ptr->outputNodes[i]* (1 -network_ptr->outputNodes[i]) * network_ptr->intermediateNodes[j];
            //cout << "weight: " << network_ptr->intermediateToOutput[j][i] << "  deltaW:  " << deltaW;
            network_ptr->intermediateToOutput[j][i] += deltaW;
            //cout << "  new weight: " << network_ptr->intermediateToOutput[j][i] << endl;
        }
    }

    for(int i=0;i<3; i++){ //adjust weights between input and intermediate
        for(int j=0;j<3; j++){
            for(int k=0; k<2; k++)//this does the summation portion of the weight adjusment.
                summation =(network_ptr->outputNodes[k] - data.target[k]) * network_ptr->outputNodes[k]* (1 -network_ptr->outputNodes[k]) * network_ptr->intermediateNodes[j]*network_ptr->intermediateToOutput[j][k]
                            * network_ptr->intermediateNodes[j]* (1- network_ptr->intermediateNodes[j]) * network_ptr->inputNodes[i];
                network_ptr->inputToIntermediate[i][j] += stepsize*summation;
        }
    }
}

По мере того, как веса корректируются, они просто продолжают расти по какой-то причине.Однажды я запустил его, и вес поднялся до 7,8.Я отправил весь проект своему профессору, и он сказал, что все выглядит правильно.Так что я совершенно ошеломлен.

Любой совет с благодарностью!

1 Ответ

0 голосов
/ 01 мая 2019

Строка 10:

network_ptr->intermediateToOutput[j][i] += deltaW;

вместо [i][j].

...