【发布时间】:2017-06-19 17:57:59
【问题描述】:
我正在尝试教一个神经网络根据其输入的生命水平来决定去哪里。神经网络将始终接收三个输入[x, y, life]。如果life => 0.2,它应该输出从[x, y]到(1, 1)的角度。如果是life < 0.2,它应该输出从[x, y]到(0, 0)的角度。
由于神经元的输入和输出应该在0 和1 之间,我将角度除以2 *Math.PI。
代码如下:
var network = new synaptic.Architect.Perceptron(3,4,1);
for(var i = 0; i < 50000; i++){
var x = Math.random();
var y = Math.random();
var angle1 = angleToPoint(x, y, 0, 0) / (2 * Math.PI);
var angle2 = angleToPoint(x, y, 1, 1) / (2 * Math.PI);
for(var j = 0; j < 100; j++){
network.activate([x,y,j/100]);
if(j < 20){
network.propagate(0.3, [angle1]);
} else {
network.propagate(0.3, [angle2]);
}
}
}
在这里试试:jsfiddle
因此,当我输入以下输入 [0, 1, 0.19] 时,我希望神经网络输出接近 [0.75] (1.5PI / 2PI) 的内容。但是我的结果完全不一致,并且与给出的任何输入都没有关联。
我在教授神经网络时犯了什么错误?
我已经成功地教一个神经网络在输入
[a, b, c]和c => 0.2时输出1,当输入[a, b, c]和c < 0.2时输出0。我还设法教它根据[x, y]输入输出到某个位置的角度,但是我似乎无法将它们组合起来。
根据要求,我编写了一些代码,使用 2 个神经网络来获得所需的输出。第一个神经网络将生命水平转换为 0 或 1,第二个神经网络根据第一个神经网络输出的 0 或 1 输出一个角度。这是代码:
// This network outputs 1 when life => 0.2, otherwise 0
var network1 = new synaptic.Architect.Perceptron(3,3,1);
// This network outputs the angle to a certain point based on life
var network2 = new synaptic.Architect.Perceptron(3,3,1);
for (var i = 0; i < 50000; i++){
var x = Math.random();
var y = Math.random();
var angle1 = angleToPoint(x, y, 0, 0) / (2 * Math.PI);
var angle2 = angleToPoint(x, y, 1, 1) / (2 * Math.PI);
for(var j = 0; j < 100; j++){
network1.activate([x,y,j/100]);
if(j < 20){
network1.propagate(0.1, [0]);
} else {
network1.propagate(0.1, [1]);
}
network2.activate([x,y,0]);
network2.propagate(0.1, [angle1]);
network2.activate([x,y,1]);
network2.propagate(0.1, [angle2]);
}
}
在这里试试:jsfiddle
正如您在此示例中所见。它设法非常接近地达到所需的输出,通过增加更多的迭代它会更接近。
【问题讨论】:
-
我建议在隐藏层添加更多的神经元。
-
@cdm 我试过了,但没有什么不同。我正在尝试通过配置各个层来创建自己的网络。
-
要么你的层有问题,要么使用多个神经网络是更好的解决方案。
-
@Walfrat hmm 似乎是唯一的解决方案。我会尝试相互投射网络。
-
否则您可以检查您的 javascript 库是否提供了除神经网络之外的其他东西,对于 0/1 类型的结果,支持向量机 (SVM) 比神经网络轻得多。
标签: javascript neural-network backpropagation