用正弦函数训练神经网络

戴维·LR

我想用sine()函数训练一个神经网络。

当前,我使用此代码和(cerebrum gem):

require 'cerebrum'

input = Array.new
300.times do |i|
  inputH = Hash.new
  inputH[:input]=[i]
  sinus = Math::sin(i)
  inputH[:output] = [sinus]
  input.push(inputH)

end

network = Cerebrum.new

network.train(input, {
  error_threshold: 0.00005,
  iterations:      40000,
  log:             true,
  log_period:      1000,
  learning_rate:   0.3
})


res = Array.new
300.times do |i|
  result = network.run([i])
  res.push(result[0])
end

puts "#{res}"

但这是行不通的,如果我运行受过训练的网络,我会得到一些奇怪的输出值(而不是得到正弦曲线的一部分)。

所以,我做错了什么?

尼尔·斯莱特(Neil Slater)

脑是非常基本且缓慢的神经网络实现。Ruby中有更好的选择,例如ruby-fanngem。

您的问题很可能是网络过于简单。您尚未指定任何隐藏层-看起来代码为您的案例分配了一个默认的隐藏层,其中包含3个神经元。

尝试类似的东西:

network = Cerebrum.new({
  learning_rate:  0.01,
  momentum:       0.9,
  hidden_layers:  [100]
})

并期望它需要永远的训练,再加上仍然不是很好。

另外,您选择的300个输出范围太广-对于网络而言,它看起来像是噪声,并且在点之间的内插效果不佳。神经网络无法以某种方式找出“哦,那一定是正弦波”并与其匹配。相反,它在点之间进行插值-一次在多个维度上进行操作时,会出现聪明点,也许是发现了手动检查无法轻易发现的结构。为了给它一个学习东西的合理机会,我建议您给它一些密集点,例如您当前sinus = Math::sin(i)使用的地方:

sinus = Math::sin(i.to_f/10)

通过正弦波,这仍然是将近5次迭代。希望这足以证明网络可以学习任意功能。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章