Здравствуйте. Пытался реализовать вот этот алгоритм http://robocraft.ru/blog/algorithm/560.html однако когда провел обучение сети, обнаружил, что выходные данные даже близко не соответствуют действительности. Где же я допустил ошибку? Или алгоритм по ссылке неправильный? Помогите разобраться.
double OpenNNL::_changeWeightsByBP(double * trainingInputs, double *trainingOutputs, double speed, double sample_weight)
{
double * localGradients = new double[_neuronsCount];
double * outputs = new double[_neuronsCount];
double * derivatives = new double[_neuronsCount];
calculateNeuronsOutputsAndDerivatives(trainingInputs, outputs, derivatives);
for(int j=0;j<_neuronsPerLayerCount[_layersCount-1];j++)
{
localGradients[indexByLayerAndNeuron(_layersCount-1, j)] = trainingOutputs[j] - outputs[indexByLayerAndNeuron(_layersCount-1, j)];
}
if(_layersCount > 1)
{
for(int i=_layersCount-2;i>=0;i--)
{
for(int j=0;j<_neuronsPerLayerCount[i];j++)
{
localGradients[indexByLayerAndNeuron(i, j)] = 0;
for(int k=0;k<_neuronsPerLayerCount[i+1];k++)
{
localGradients[indexByLayerAndNeuron(i, j)] += _neuronsInputsWeights[indexByLayerNeuronAndInput(i+1, k, j)]
* localGradients[indexByLayerAndNeuron(i+1, k)];
}
}
}
}
for(int j=0;j<_neuronsPerLayerCount[0];j++)
{
for(int k=0;k<_inputsCount;k++)
{
_neuronsInputsWeights[indexByLayerNeuronAndInput(0, j, k)] += speed * localGradients[indexByLayerAndNeuron(0, j)]
* derivatives[indexByLayerAndNeuron(0, j)] * trainingInputs[k];
}
}
for(int i=1;i<_layersCount;i++)
{
for(int j=0;j<_neuronsPerLayerCount[i];j++)
{
for(int k=0;k<_neuronsPerLayerCount[i-1];k++)
{
_neuronsInputsWeights[indexByLayerNeuronAndInput(i, j, k)] += speed * localGradients[indexByLayerAndNeuron(i, j)]
* derivatives[indexByLayerAndNeuron(i, j)] * outputs[indexByLayerAndNeuron(i, j)];
}
}
}
delete[] localGradients;
delete[] outputs;
delete[] derivatives;
}
И в том алгоритме не сказано, как настраивать смещения нейронов. Может кто-нибудь подсказать как это делать?
Если вам понадобится полный код, то он здесь: https://github.com/NicholasShatokhin/OpenNNL
Ответ
ох, нашел ошибку. В последнем цикле нужно было вместо outputs[indexByLayerAndNeuron(i, j)]; написать: outputs[indexByLayerAndNeuron(i-1, k)]; Все беды от невнимательности.
Комментариев нет:
Отправить комментарий