训练后,Neataptic始终返回相同的值

时间:2017-10-07 14:08:59

标签: machine-learning neural-network synaptic.js

编辑:我成功地聚集了几个简单的例子https://github.com/developer239/neural-network-playground

我刚开始玩neataptic。我想让神经网络学习如何使用数字来计算:1,2,3,4,5,6,7,8,9。

我将输入归一化为0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9。

然后我编写了一个非常简单的培训计划,教会网络如何添加1 + 2(0.1 + 0.3)。

const architect = require('neataptic').architect


const myTrainingSet = [
  { input: [0.1, 0.2], output: [0.3] },
  { input: [0.2, 0.1], output: [0.3] }
];

myNetwork = architect.Perceptron(2, 3, 1);

myNetwork.train(myTrainingSet, {
  log: 1,
  error: 0.01,
  iterations: 1000,
  rate: 0.3
});

console.log(myNetwork.activate([0,0]));
console.log(myNetwork.activate([1,1]));
console.log(myNetwork.activate([0.1,0.2]));

问题是这个日志:

[ 0.3717501873608793 ]
[ 0.3695919770977549 ]
[ 0.37142744367869446 ]

它基本上为每个输入记录0.3。有人可以解释我做错了什么吗? :)

1 个答案:

答案 0 :(得分:2)

数据集太小,神经网络无法从模式中学习。您只提供了以0.3作为输出的样本。神经网络通过始终输出0.3来最小化其错误,因为这正是它的训练方式。我创建了一个包含1000个(动态生成的)样本的示例,这似乎有效:

const architect = neataptic.architect;

const trainingSet = [];

for (var i = 0; i < 1000; i++) {
    let integer1 = Math.floor(Math.random() * 10);
  let integer2 = Math.round(Math.random() * (10 - integer1));

  let output = (integer1 + integer2) / 10;

  trainingSet.push({ input: [integer1 / 10, integer2 / 10], output: [output] });
}

myNetwork = architect.Perceptron(2, 3, 1);

myNetwork.train(trainingSet, {
  log: 50,
  error: 0.0001,
  iterations: 1000,
  rate: 0.3,
  momentum: 0.9
});

console.log(myNetwork.activate([0,0]));
console.log(myNetwork.activate([0.1,0.2]));
console.log(myNetwork.activate([0.5, 0.5]));

JSFiddle