我正在尝试训练前馈网络,以便使用Ruby Library AI4R执行XOR操作.但是,当我在训练后评估XOR时.我没有得到正确的输出.有没有人之前使用过这个库并得到它来学习XOR操作.
我正在使用两个输入神经元,一个隐藏层中的三个神经元,以及一个用于输出的层,因为我之前看到过这样的预先计算的XOR前馈神经网络.
require "rubygems" require "ai4r" # Create the network with: # 2 inputs # 1 hidden layer with 3 neurons # 1 outputs net = Ai4r::NeuralNetwork::Backpropagation.new([2, 3, 1]) example = [[0,0],[0,1],[1,0],[1,1]] result = [[0],[1],[1],[0]] # Train the network 400.times do |i| j = i % result.length puts net.train(example[j], result[j]) end # Use it: Evaluate data with the trained network puts "evaluate 0,0: #{net.eval([0,0])}" # => evaluate 0,0: 0.507531383375123 puts "evaluate 0,1: #{net.eval([0,1])}" # => evaluate 0,1: 0.491957823618629 puts "evaluate 1,0: #{net.eval([1,0])}" # => evaluate 1,0: 0.516413912471401 puts "evaluate 1,1: #{net.eval([1,1])}" # => evaluate 1,1: 0.500197884691668
摊晒
您没有经过足够的迭代训练.如果你改变你400.times
,8000.times
你会更接近(并且更接近20000.times
).
在20000.times
,我明白了
puts "evaluate 0,0: #{net.eval([0,0])}" # => evaluate 0,0: 0.030879848321403 puts "evaluate 0,1: #{net.eval([0,1])}" # => evaluate 0,1: 0.97105714994505 puts "evaluate 1,0: #{net.eval([1,0])}" # => evaluate 1,0: 0.965055940880282 puts "evaluate 1,1: #{net.eval([1,1])}" # => evaluate 1,1: 0.0268317078331645
你也可以增加net.learning_rate
(但不要太多).