我想用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}"
但这是行不通的,如果我运行受过训练的网络,我会得到一些奇怪的输出值(而不是得到正弦曲线的一部分)。
所以,我做错了什么?
脑是非常基本且缓慢的神经网络实现。Ruby中有更好的选择,例如ruby-fann
gem。
您的问题很可能是网络过于简单。您尚未指定任何隐藏层-看起来代码为您的案例分配了一个默认的隐藏层,其中包含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] 删除。
我来说两句