Проблема с простой искусственной нейронной сетью - добавление

Я пытаюсь заставить простую искусственную нейронную сеть работать с алгоритмом обратного распространения. Я создал ИНС и считаю, что правильно реализовал алгоритм BP, но, конечно, могу ошибаться.

Прямо сейчас, Я пытаюсь обучить сеть, давая ей два случайных числа (a, b) от 0 до 0,5 и добавляя их. Затем, конечно, каждый раз, когда выходной сигнал сети сравнивается с теоретическим ответом a + b (который всегда будет достигнут с помощью сигмоидной функции).

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

Редактировать: Извините, похоже, это не сходится. Вот изображение результата:

enter image description here

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

Я также пытался присвоить ему два постоянных числа (0,35,0,9) и попытаться приучить его выплевывать 0.5. Это работает и очень быстро сходится к 0,5. Я также научил его выплевывать 0. 5, если я дам ему любые два случайных числа от 0 до 1, и это тоже сработает.

Если вместо этого моя цель:

vector target;
target.push_back(.5);

Тогда он сходится очень быстро, даже при случайных входных данных:

enter image description here

Я пробовал пару разных сетей, так как я упростил добавление слоев в мою сеть. Стандартный, который я использую, - это один с двумя входами, один слой из 2 нейронов и второй слой только из одного нейрона (выходной нейрон). Однако я также попытался добавить несколько слоев и добавить к ним нейроны. Кажется, это ничего не меняет. Моя скорость обучения равна 1,0, хотя я пробовал равняться 0,5, и это не сильно отличалось.

Кто-нибудь знает, что я могу попробовать?

Может ли ИНС на это вообще что-то? Я не могу себе представить, чтобы это было не так, ведь их можно научить делать такие сложные вещи.

Есть совет? Спасибо!

Вот где я его обучаю:

//Initialize it. This will be one with 2 layers, the first having 2 Neurons and the second (output layer) having 1.
vector networkSize;
networkSize.push_back(2);
networkSize.push_back(1);
NeuralNetwork myNet(networkSize,2);

for(int i = 0; i<5000; i++){
    double a = randSmallNum();
    double b = randSmallNum();
    cout << "\n\n\nInputs: " << a << ", " << b << " with expected target: " << a + b;

    vector myInput;
    myInput.push_back(a);   
    myInput.push_back(b);   

    vector target;
    target.push_back(a + b);

    cout << endl << "Iteration " << i;
    vector output = myNet.backPropagate(myInput,target);
    cout << "Output gotten: " << output[0];
    resultPlot << i << "\t" << abs(output[0] - target[0]) << endl;
}

Изменить: Я настроил свою сеть и следовал этому руководству: PDF-файл . Я реализовал «Рабочий пример 3.1» и получил те же точные результаты, что и они, поэтому я думаю, что моя реализация верна, по крайней мере, в той степени, в которой они.

11
задан MasterZibZob 1 May 2011 в 17:34
поделиться