lxfr
@lxfr

Нейронная сеть FANN — вопрос по коду, поясните почему такой результат происходит?

Есть такая библиотека FANN - искусственная нейронная сеть.
Ее можно установить и подключить к PHP, например, в качестве расширения.
Далее я пишу следующий код:

$ann = fann_create_standard_array(3, array(2, 3, 1)); //создали нейронную сеть с 2 входящими нейронами, 1 слоем из 3 нейронов, и 1 выходящим нейроном, итого у нас 8 нейронов будет всего
var_dump(fann_get_num_input($ann)); // количество входящих нейронов (2)
var_dump(fann_get_num_output($ann)); // количество исходящих нейронов (1)
var_dump(fann_randomize_weights($ann,1,100)); // рандомизировали веса нейронов от 1 до 100, например, слуачйно
var_dump(fann_get_total_neurons($ann)); //всего нейронов в сети, должно быть 8
var_dump(fann_train($ann,array(25,13),array(7))); //обучили нейронную сеть что входящие 25 и 13 = 7, и на выходе получаем 1 почему-то в функции fann_run:
var_dump(fann_run($ann,array(25,13))); //запустили нейронную сеть, получили 1, а ждем 7.. :(
var_dump(fann_get_connection_array($ann)); //получили такой странный результат связей и результат 1, а не 7


А вот и результат выполнения:


int(2)
int(1)
bool(true)
int(8)
bool(true)
array(1) {
[0]=>
float(1)
}
array(13) {
[0]=>
object(FANNConnection)#1 (3) {
["from_neuron"]=>
int(0)
["to_neuron"]=>
int(3)
["weight"]=>
float(45.033920288086)
}
[1]=>
object(FANNConnection)#2 (3) {
["from_neuron"]=>
int(1)
["to_neuron"]=>
int(3)
["weight"]=>
float(59.61791229248)
}
[2]=>
object(FANNConnection)#3 (3) {
["from_neuron"]=>
int(2)
["to_neuron"]=>
int(3)
["weight"]=>
float(65.410202026367)
}
[3]=>
object(FANNConnection)#4 (3) {
["from_neuron"]=>
int(0)
["to_neuron"]=>
int(4)
["weight"]=>
float(100.04418182373)
}
[4]=>
object(FANNConnection)#5 (3) {
["from_neuron"]=>
int(1)
["to_neuron"]=>
int(4)
["weight"]=>
float(59.478809356689)
}
[5]=>
object(FANNConnection)#6 (3) {
["from_neuron"]=>
int(2)
["to_neuron"]=>
int(4)
["weight"]=>
float(88.301513671875)
}
[6]=>
object(FANNConnection)#7 (3) {
["from_neuron"]=>
int(0)
["to_neuron"]=>
int(5)
["weight"]=>
float(33.477821350098)
}
[7]=>
object(FANNConnection)#8 (3) {
["from_neuron"]=>
int(1)
["to_neuron"]=>
int(5)
["weight"]=>
float(62.174163818359)
}
[8]=>
object(FANNConnection)#9 (3) {
["from_neuron"]=>
int(2)
["to_neuron"]=>
int(5)
["weight"]=>
float(47.344665527344)
}
[9]=>
object(FANNConnection)#10 (3) {
["from_neuron"]=>
int(3)
["to_neuron"]=>
int(7)
["weight"]=>
float(54.048503875732)
}
[10]=>
object(FANNConnection)#11 (3) {
["from_neuron"]=>
int(4)
["to_neuron"]=>
int(7)
["weight"]=>
float(60.595252990723)
}
[11]=>
object(FANNConnection)#12 (3) {
["from_neuron"]=>
int(5)
["to_neuron"]=>
int(7)
["weight"]=>
float(90.935493469238)
}
[12]=>
object(FANNConnection)#13 (3) {
["from_neuron"]=>
int(6)
["to_neuron"]=>
int(7)
["weight"]=>
float(21.079444885254)
}
}


Вопрос - почему на выходном нейроне я не получаю результат 7, а получаю результат 1, хотя запускаю сеть с теми же входящими параметрами 25 и 13, как и было проведено обучение сети ранее, которое значит, что входные параметры 25 и 13 равны должны быть именно 7?

P.S. игра с весами и их рандомизацией результатов не дала, добавление еще слоя - тоже, увеличение нейронов в 2 слое тоже, не меняет картину.
  • Вопрос задан
  • 2846 просмотров
Решения вопроса 1
wielski
@wielski
✔ Совет: Вам помогли? Отметьте ответы решением.
Восстание машин началось.
А если серьезно - нейронные сети основаны на вероятностях. Передавая данные один раз - шанс получить их обратно крайне мал.
Попробуйте прогнать fann_train в цикле, и убедитесь, что в таком случае результаты будут более верными:
for($i=0;$i<500000;$i++) {
  fann_train(...);
}


А вообще, тут немного замешана философия. Почему 7 не может быть единицей?
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@kordenv
Не знаю нужен ли еще ответ или нет, код немного не верен
Вы на выходе ставите 1 нейрон, он Вам и ответ правильный дает
если на выход сделать 10 нейронов
$ann = fann_create_standard_array(3, array(2, 3, 10));

а в обучении сделать вот так:
for($i = 0; $i < 500000; $i++)
{
if ($i % 100000 == 0) print "$i\n";
fann_train($ann, array(25, 13), array(0, 0, 0, 0, 0, 0, 1, 0, 0, 0));
}

то на выходе получаете
print_r(fann_run($ann, array(25, 13)));
верный ответ в индексе 6 (цифра 7)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы