Я пытаюсь заставить простую искусственную нейронную сеть работать с алгоритмом обратного распространения. Я создал ИНС и считаю, что правильно реализовал алгоритм 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-файл . Я реализовал " Я хочу работать на machine2.abc.def.edu, к которой я могу подключиться только через machine1.abc.def.edu. Мое имя пользователя - мое имя, на обоих ...
Может кто-нибудь помочь мне настроить Emacs Tramp на двойной прыжок? Я хочу работать на machine2.abc.def.edu, к которой я могу подключиться только через machine1.abc.def.edu. Мое имя пользователя - myname, на обеих машинах одно и то же.
Я пытался добавить .emacs:
(add-to-list 'tramp-default-proxies-alist
'("\\`machine2\\.abc\\.def\\.edu\\'"
"\\`myname\\'"
"/ssh:machine1\\.abc\\.def\\.edu:"))
Это моя лучшая интерпретация того, что написано в руководстве. Тогда я делаю: Cx Cf /ssh:machine2.abc.def.edu или: Cx Cf / ssh: rsuhada@machine2.abc.def.edu
Но оба дают:
ssh: Could not resolve hostname ssh: nodename nor servname provided, or not known
Process *tramp/scpc ssh* exited abnormally with code 255
И мои Аквамаки не могут быть закрыты и должны быть убиты из оболочки ... Здесь есть двухлетняя ветка с тем же вопросом. Я попробовал ответить оттуда:
(add-to-list 'tramp-default-proxies-alist
'("machine2.abc.def.edu"
nil
"/ssh:myname@machine1.abc.def.edu:"))
С теми же результатами ... также для всех комбинаций, которые я мог придумать ... Однако удаленное редактирование на machine1.abc.def.edu работает нормально.