经过my previous attempt,我设法训练一个神经网络来表达正弦函数。我用ai4r红宝石:神经网络正弦函数
require 'ai4r'
srand 1
net = Ai4r::NeuralNetwork::Backpropagation.new([1, 60, 1])
net.learning_rate = 0.01
#net.propagation_function = lambda { |x| 1.0/(1.0 + Math::exp(-x)) }
def normalise(x, xmin, xmax, ymin, ymax)
xrange = xmax - xmin
yrange = ymax - ymin
return ymin + (x - xmin) * (yrange.to_f/xrange)
end
training_data = Array.new
test = Array.new
i2 = 0.0
320.times do |i|
i2 += 0.1
hash = Hash.new
output = Math.sin(i2.to_f)
input = i2.to_f
hash.store(:input,[normalise(input,0.0,32.0,0.0,1.0)])
hash.store(:expected_result,[normalise(output,-1.0,1.0,0.0,1.0)])
training_data.push(hash)
test.push([normalise(output,-1.0,1.0,0.0,1.0)])
end
puts "#{test}"
puts "#{training_data}"
time = Time.now
999999.times do |i|
error = 0.0
training_data.each do |d|
error+=net.train(d[:input], d[:expected_result])
end
if error < 0.26
break
end
print "Times: #{i}, error: #{error} \r"
end
time2 = Time.now
puts "#{time2}-#{time} = #{time2-time} Sekunden gebraucht."
serialized = Marshal.dump(net)
File.open("net.saved", "w+") { |file| file.write(serialized) }
一切工作正常。该网络训练了4703.664857秒。
当我正常化0和1之间ai4r
输入/输出到多个所述的网络将被更快地训练使用S形函数,所以很明显,它不输出负值。但为什么我必须规范化输入值?这种神经网络仅接受输入值< 1吗?
在正弦例子中,是有可能输入的任何数量的如:
Input: -10.0 -> Output: 0.5440211108893699
Input: 87654.322 -> Output: -0.6782453567239783
Input: -9878.923 -> Output: -0.9829544956991526
或我必须限定的范围内。
“同样,如果你给它一些大的东西,比如:1e10,那么第一层就会给出:”为什么顺序(现在是从大到小的数字)会改变? –
哎呀,它不会。我做了一些不好的数学:)它应该给出大量的1(或非常接近1的东西)的数组,这对于神经网络来说也是很难区分的。我编辑了我的帖子。 – Andnp