Я пытаюсь заставить простую искусственную нейронную сеть работать с алгоритмом обратного распространения. Я создал ИНС и считаю, что правильно реализовал алгоритм BP, но, конечно, могу ошибаться.
Прямо сейчас, Я пытаюсь обучить сеть, давая ей два случайных числа (a, b) от 0 до 0,5 и добавляя их. Затем, конечно, каждый раз, когда выходной сигнал сети сравнивается с теоретическим ответом a + b (который всегда будет достигнут с помощью сигмоидной функции).
Как ни странно, результат всегда сходится к числу от 0 до 1 (как и должно быть, из-за сигмовидной функции), но вводимые мной случайные числа, похоже, не влияют на это.
Редактировать: Извините, похоже, это не сходится. Вот изображение результата:
Веса случайным образом распределяются между -1 и 1, но я также пробовал между 0 и 1.
Я также пытался присвоить ему два постоянных числа (0,35,0,9) и попытаться приучить его выплевывать 0.5. Это работает и очень быстро сходится к 0,5. Я также научил его выплевывать 0. 5, если я дам ему любые два случайных числа от 0 до 1, и это тоже сработает.
Если вместо этого моя цель:
vector target;
target.push_back(.5);
Тогда он сходится очень быстро, даже при случайных входных данных:
Я пробовал пару разных сетей, так как я упростил добавление слоев в мою сеть. Стандартный, который я использую, - это один с двумя входами, один слой из 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» и получил те же точные результаты, что и они, поэтому я думаю, что моя реализация верна, по крайней мере, в той степени, в которой они.