开发者

Training neural network for XOR in Ruby

开发者 https://www.devze.com 2023-01-25 10:50 出处:网络
I am trying to train a feedforward network to work to perform an XOR operations with the Ruby Library AI4R. However,

I am trying to train a feedforward network to work to perform an XOR operations with the Ruby Library AI4R. However, when I evaluate for the XOR after training it. I am not getting the correct output. Has anyone used this library before and gotten it to learn the XOR operation.

I am using two input neurons, three neurons in a hidden layer, and one layer for the output, as I saw a precomputed XOR feed forward neural network like this before.

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

开发者_如何学Go # 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

Ted


You haven't trained it for enough iterations. If you change 400.times to 8000.times you'll come much closer (and closer still at 20000.times).

At 20000.times, I get

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

You can also increase net.learning_rate (but not too much).


If you want to consider Neuroevolution, you may check up the neuroevo gem. Run the specs to see it fit XOR in 15 iterations ([2,2,1] feed-forward network, XNES optimizer):

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

Full disclosure: I'm the developer (hi there!).
I just recently began published my code and am looking for feedback.

0

精彩评论

暂无评论...
验证码 换一张
取 消