javascript neura lnet сбой алгоритма обратного распространения - PullRequest
0 голосов
/ 09 февраля 2020

У меня проблемы с созданием рекурсивной функции для правильного перемещения по сети.

Проблема: массив объектов, называемых ячейками, имеет функцию:

whatIwant(wanted value, bucket array)

, которая вызывает сам по себе для каждого соединения с последним «поколением» ячеек.

При количестве ячеек ответа (3 поколения по 2 порядка) + 3) я должен получить 27 рекурсивных вызовов? Я получаю 107200 элементов в моем массиве возврата - вместо 27.

IF i don't call Flat() in the code: the return array is in a weird recursive pattern:
(34) [{…}, {…}, {…}, {…}, Array(34), {…}, {…}, Array(34), {…}, {…}, Array(34), Array(34), {…}, {…}, {…}, Array(34), {…}, {…}, Array(34), {…}, {…}, Array(34), Array(34), {…}, {…}, {…}, Array(34), {…}, {…}, Array(34), {…}, {…}, Array(34), Array(34)]
where each array of 34 is yet another array of exactly this array.

Как я думаю, это должно работать следующим образом: (что я думаю, я написал) объект мозга вызывает whatIWant () для каждого ' answer cell 'в конце, он вычисляет все необходимые корректировки, а затем для каждой из своих предыдущих целей уровня он вызывает объекты. эта активация) и как массив, ссылка на массив, сгенерированный вне этой функции - который начинается пустым, непрерывно выдвигая updateobjectcontainer, который применяется к braincell после того, как мозг вызывает метод answerCell.whatIWant (), и эти массивы суммируются / усредняем вместе.

путь рекурсии в моей голове (с 3gen: 2order) {cell.gen3, order0} вызывает {cell.gen2, order0}, вызывает {cell.gen1.order0} вызывает {cell.gen0.order0), возвращает обратно в {cell.gen1.order0}, который вызывает cell.gen0.order1}, который возвращает обратно в {cell.gen1.order0}, который возвращает urns {cell.gen2.order0}, который вызывает {cell.gen1.order0}, который вызывает {cell.gen0.order0}. и продолжается до тех пор, пока не достигнет верхнего логова, пройдя матрицу несколько раз.

, если я не называю flat, он создает массив объектов, надеюсь, кто-то просто и быстро скажет мне, почему я идиот.

some quick helper function defs:

Flat() = returns an array that has been recursively flattened;
Sigmoid() maps all input to between 0-1;
ArrayMultiply() takes two arrays and multiplies against index return a number;
brain.cellArray is the bucket for all the cells;

//
//recusion logic
whatIwant:function(answerValue, returnArray)
            {
         //stuff here that calculates an 
         //objects value(represents the desired 
         //change to the real cell above this 
        //abstraction we combine/average duplicates
       //entries formed in this return array
            if(Array.isArray(cell.lastGenerationTargetKeys) && cell.lastGenerationTargetKeys.length)
                {
                cell.lastGenerationTargetKeys.forEach(x=> returnArray.push(brain.cellArray[x].whatIwant(desiredObjectChange.activations[x], returnArray))); 
                return Flat(returnArray);
            }
            else  
                {
                returnArray.push(desiredObjectChange);      
                return Flat(returnArray);
            }


edit / updated для ясности.

1 Ответ

0 голосов
/ 12 февраля 2020

Итак, глядя на это более свежим взглядом, происходило следующее: я правильно путешествовал по сети, но неправильно обрабатывал массив.

Я вставлял ссылку returnArray в себя когда элемент в массиве - это массив, в котором он находится ... в плохие времена.

Обновленный код такой:

if(Array.isArray(cell.lastGenerationTargetKeys) && cell.lastGenerationTargetKeys.length)
{               
    let nextActivation = desiredObjectChange.activations[Symbol.iterator]();
    cell.lastGenerationTargetKeys.forEach(x => brain.cellArray[x].whatIwant(nextActivation.next().value, returnArray)); 
    return returnArray;
}
else  
{
    return;     
}
...