我一直在尝试为蓬松的鸟类克隆实现增强神经拓扑进化(NEAT)算法,请参考youtube上的教程。
在本教程之后,我遇到了以下问题:
执行index.html
时,出现以下错误。
TypeError: func is not a function matrix.js:104:27
这令人困惑,因为matrix.js
和nn.js
都是本教程的执行者提供给我的库函数。
查看matrix.js的代码,我发现抛出错误的行是
this.data[i][j] = func(val,i,j);
但是在func()
或matrix.js
的任何地方都找不到函数nn.js
的函数定义。
但是在nn.js
的代码中,我发现func
被称为变量而不是函数。
class ActivationFunction {
constructor(func, dfunc) {
this.func = func;
this.dfunc = dfunc;
}
}
let sigmoid = new ActivationFunction(
x => 1 / (1 + Math.exp(-x)),
y => y * (1 - y)
);
let tanh = new ActivationFunction(
x => Math.tanh(x),
y => 1 - (y * y)
);
和
setActivationFunction(func = sigmoid) {
this.activation_function = func;
}
因此,我假设func旨在为val
提供this.data[I][j]
的S形值,所以我编写了自己的Sigmoid函数,将激活函数的值馈送到this.data[I][j]
。在执行时引发了错误
ReferenceError: NeuralNetwork is not defined[Learn More] bird.js:25:7
因此,我决定放弃尝试编写函数的决定,并决定将S型激活函数的值直接复制到变量this.data[I][j]
中,如下所示:
this.data[i][j] = 1/(1+Math.pow(Math.E, -val));
此方法未引发任何错误,但确实给我带来了一个新问题。 较早的每一代人口中的每个成员将独立行动,产生如下输出:
不是在第二张图像中只生成了一个玩家对象,而是生成了250个对象,但是它们又一个又一个地叠加在一起,因此似乎只有一个玩家对象。这是由于
1/(1+Math.pow(Math.E, -val));
将完全相同的值发送到this.data[I][j]
,我观察到,当将不同的值传递给this.data[I][j]
时,每个玩家对象都会独立行动。
是否有人对func为什么有任何想法。一个文件中的变量是变量,而func是另一个文件中的函数吗?
我很抱歉,因为我不够清楚,因为这是库文件中的错误,我不是矩阵运算的专家,并且我已尽我所能尝试传达了我所面临的问题。到目前为止,我所认识的人都没有遇到过这些问题。
所有必需的文件都可以找到here