6

我正在试图训练一个前馈网络来执行Ruby库AI4R的XOR操作。但是,当我在训练之后评估XOR时,需要 。我没有得到正确的输出。有没有人在 之前使用过这个库,并学会了XOR操作。在Ruby中为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 

特德

+0

你可能会感兴趣的这个答案:http://stackoverflow.com/a/38767930/5082406 – 2016-08-05 06:56:31

回答

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(但是不要太多)。

+0

我想知道它为什么这么慢。 – Flethuseo 2010-11-16 17:48:52

+1

嗯。有趣的..我已经尝试了最多4000次迭代..而且我已经看到了一个反向传播工作相当好的数量。我没费心去尝试这么多迭代:)。我注意到,它的工作原理与1 – Flethuseo 2010-11-16 18:00:28

+0

一个学习速度好一点以防万一类似的东西,有人搜索,我发现了一堆的神经网络,人工智能的东西,在这里的例子: 宝石/ ai4r-1.9 /例子/ – Flethuseo 2010-11-16 19:28:24