javascript神经网络反向传播算法失败

javascript神经网络反向传播算法失败,javascript,arrays,recursion,tree,backpropagation,Javascript,Arrays,Recursion,Tree,Backpropagation,我在构建递归函数以在网络上正确运行时遇到问题 问题在于:称为单元的对象数组具有以下功能: 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:

我在构建递归函数以在网络上正确运行时遇到问题

问题在于:称为单元的对象数组具有以下功能:

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.
我认为它应该如何工作如下:(我认为我写的) brain对象在最后对每个“应答单元”调用whatIWant(),它计算所有需要的调整,然后在它的每个上一层目标上,它调用该对象。whatIWant()作为一个值传入-desiredObject.activation[i](该单元将激活的值)作为数组,对该函数外部生成的数组的引用-该数组开始为空,在大脑调用所有answerCell.whatIWant()之后,持续推送一个updateobjectcontainer应用于braincell,并将这些数组相加/平均

我头脑中的递归路径(使用3gen:2order){cell.gen3,order0}调用{cell.gen2,order0},调用{cell.gen1.order0}调用{cell.gen0.order0},返回到{cell.gen1.order0},调用cell.gen0.order1},返回到{cell.gen1.order0},调用{cell.gen1.order0}{cell.gen0.order0}。它将继续运行,直到它到达多次遍历矩阵的顶部巢穴为止

如果我不调用flat,它将创建一个对象数组 希望有人能简单而迅速地告诉我为什么我是个白痴

一些快速助手函数定义:
Flat()=返回已递归展平的数组;
Sigmoid()将所有输入映射到0-1之间;
ArrayMultiply()接受两个数组并与索引相乘,返回一个数字;
大脑是所有细胞的桶;
//
//递归逻辑
whatIwant:函数(answerValue、returnArray)
{
//这里的东西可以计算出
//对象值(表示所需的
//更改为此上方的真实单元格
//我们合并/平均重复项
//在此返回数组中形成的条目
if(Array.isArray(cell.lastGenerationTargetKeys)和&cell.lastGenerationTargetKeys.length)
{
cell.lastGenerationTargetKeys.forEach(x=>returnArray.push(brain.cerllary[x].whatIwant(desiredObjectChange.activations[x],returnArray));
返回平面(返回阵列);
}
其他的
{
returnArray.push(desiredObjectChange);
返回平面(返回阵列);
}

编辑/更新以保持清晰。

因此,用更清晰的眼光来看,发生的事情是:我正确地通过网络,但我没有正确地处理阵列

我把returnArray的引用推到了它本身,当数组中的一个项目就是它所在的数组时……糟糕的时候

更新后的代码如下:

if(Array.isArray(cell.lastGenerationTargetKeys)和&cell.lastGenerationTargetKeys.length)
{               
让nextActivation=desiredObjectChange.activations[Symbol.iterator]();
cell.lastGenerationTargetKeys.forEach(x=>brain.cerllaray[x].whatIwant(nextActivation.next().value,returnArray));
返回数组;
}
其他的
{
返回;
}

很高兴你找到了。我没有很好地理解这个问题,但我甚至没有合理的问题来要求澄清。