Как можно поддерживать несколько списков индексов массива, значения которых используются функцией, которая выводит массив результатов? - PullRequest
1 голос
/ 28 мая 2019

Построение редко связанной нейронной сети с нуля в Javascript.

У меня есть 2d массив. Каждый объект во втором измерении (массив [x] [y]) содержит 2 массива, начинается: [] и заканчивается: []. Каждый объект в этих массивах содержит значение и вес. Концами являются входящие соединения. Начинаются исходящие соединения. Таким образом, когда создается «синапс», он сохраняется в массиве стартов пресинаптического нейрона и массиве концов постсинаптического нейрона. (Нейроны не являются реальными объектами, просто ячейки в массиве).

Моя текущая функция прогнозирования:

predict(array, values){
    var result = [];
    if(values.length <= array[0].length){
      for(var a = 0; a < values.length; a++){
        for(var b = 0; b < array[0][a].starts.length; b++){
          array[0][a].starts[b].value = values[a];
        }
      }

      for(var c = 0; c < array.length; c++){
        for(var d = 0; d < array[c].length; d++){
          var sum = 0;
          for(var e = 0; e < array[c][d].ends.length; e++){
            sum += array[c][d].ends[e].weight * array[c][d].ends[e].value;
          }
        }
        for(var f = 0; f < array[c][d].starts[f].length; f++){
          array[c][d].starts[f].value = util.sigmoid(sum);
        }
      }

      for(var g = 0; g < array[array.length-1].length; g++){
        var sum = 0;
        for(var h = 0; h < array[array.length-1][g].ends.length; h++){
          sum += util.sigmoid(array[array.length-1][g].ends[h].weight * array[array.length-1][g].ends[h].value;
        }
        result.push(util.sigmoid(sum);
      }
    }
    else{
      log.add("### PREDICT ### Not enough input neurons. Afferent growth signal.");
    }
    return result;
}

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

Я бы хотел избежать повторного прохождения по всей сети, чтобы найти цепочку, если это возможно. Также, если вы видите что-то не так с моей функцией предсказания, пожалуйста, дайте мне знать!

Для некоторого контекста я сделал небольшую игру. В игре есть поле для игрока и поле для цели. Я хотел бы ввести playerX, playerY, targetX и targetY. Выходы: Вниз, Влево, Вверх и Вправо (направления, по которым игрок может двигаться). Итак, если input равен 1, 1, 5, 5 ... и выходной узел "Up" является "самым тяжелым", я хочу исправить веса в цепочке, которые привели к выходу Up, и усилить веса в цепочке, которая привело к выходу Down.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...