經過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