【问题标题】:Neataptic always returning same value after trainingNeataptic 在训练后总是返回相同的值
【发布时间】:2018-03-19 04:01:14
【问题描述】:

编辑:我设法收集了几个简单的例子https://github.com/developer239/neural-network-playground

我刚开始玩 netaptic。我想让神经网络学习如何使用数字进行计数: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。有人可以解释一下我做错了什么吗? :)

【问题讨论】:

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


    【解决方案1】:

    数据集太小,神经网络无法从模式中学习。您只为它提供了以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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2019-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多