Многослойный персептрон на C # - PullRequest
0 голосов
/ 22 января 2019

Я пытаюсь создать многослойный персептрон, который может правильно выводить XOR.

У меня следующая проблема.Пожалуйста, посмотрите на мою нейронную сеть, скажите мне, где моя ошибка, почему моя нейронная сеть сходится к ответу 0,45?

Веса, которые я проверяю, переполнения я не обнаружил, везде веса меньше 1, так что, скорее всего, это не паралич нейронной сети.Если вам нужно что-то уточнить, пишите.

График ошибок:

enter image description here

Абс (ошибка) график: enter image description here

Примечание:

  1. У меня смещение везде 1
  2. Чем медленнее скорость обучения, тем медленнее она приближается к 0,45
//Feed - forward computation
Layers[i].neurons[j].input = 0; Layers[i].neurons[j].output = 0;
for (int k = 0; k < Layers[i].neurons[j].weights.Count; k++)
{
  Layers[i].neurons[j].input += Layers[i].neurons[j].weights[k].weigth * Layers[i].neurons[j].weights[k].neuronFrom.output;
}
Layers[i].neurons[j].output = Layers[i].activation(Layers[i].neurons[j].input + Layers[i].neurons[j].bias);

//backpropagation to the output layer    
for (int k = 0; k < Layers.Last().neurons.Count; k++)
{
  Layers.Last().neurons[k].error = Layers.Last().neurons[k].output * (1 - Layers.Last().neurons[k].output) * (outputs[i][k] - Layers.Last().neurons[k].output);
}

//backpropagated error to the j-th hidden unit
Double sum = 0;
for (int h = 0; h < Layers[k + 1].neurons.Count; h++)
{
  sum += Layers[k + 1].neurons[h].error * Layers[k + 1].neurons[h].weights[h].weigth;
}
Layers[k].neurons[j].error = Layers[k].neurons[j].output * (1 - Layers[k].neurons[j].output) * sum; 

//Weight updates
for (int h = 0; h < Layers[k].neurons[j].weights.Count; h++)
{
  Layers[k].neurons[j].weights[h].weigth += learningRate * Layers[k].neurons[j].error * Layers[k].neurons[j].output;
}
...