我正在尝试训练一个前馈网络,使用 Ruby 库 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
Ted
回答:
你的训练迭代次数不够。 如果你将 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
(但不要增加太多)。