在Ruby中训练XOR的神经网络

时间:2010-11-16 01:35:06

标签: ruby artificial-intelligence machine-learning neural-network

我正在尝试培训前馈网络,以便使用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

泰德

2 个答案:

答案 0 :(得分:5)

您没有经过足够的迭代训练。如果您将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(但不要太多)。

答案 1 :(得分:2)

如果你想考虑神经进化,你可以查看neuroevo宝石。运行规范以查看在15次迭代中适合XOR [2,2,1]前馈网络,XNES优化器):

https://github.com/giuse/neuroevo/blob/master/spec/solver_spec.rb

完全披露:我是开发者(你好!) 我刚刚开始发布我的代码,正在寻找反馈。