6

J'essaie de former un réseau feedforward à travailler pour effectuer une opérations XOR avec le Ruby Library AI4R. Cependant, lorsque j'évalue pour le XOR après l'entraînement. Je ne reçois pas la bonne sortie. Quelqu'un at-il utilisé cette bibliothèque avant et l'a obtenu pour apprendre l'opération XOR. J'utilise deux neurones d'entrée, trois neurones dans une couche cachée, et une couche pour la sortie, comme j'ai vu un réseau neuronal d'avance précalculé comme ceci auparavant.Réseau neuronal de formation pour XOR dans Ruby

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

+0

vous pourriez être intéressé par cette réponse: http://stackoverflow.com/a/38767930/5082406 –

Répondre

5

Vous ne l'avez pas formé pour suffisamment d'itérations. Si vous changez 400.times en 8000.times vous viendrez beaucoup plus près (et plus proche encore à 20000.times).

A 20000.times, je reçois

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 

Vous pouvez également augmenter net.learning_rate (mais pas trop).

+0

Je me demande pourquoi c'est si lent. – Flethuseo

+1

Hmmm. intéressant .. J'avais essayé au plus 4000 itérations .. et j'avais vu une propagation de retour travailler assez bien avec cette quantité. Je n'ai pas pris la peine d'essayer autant d'itérations :). Je remarque que cela fonctionne un peu mieux avec un taux d'apprentissage de 1. – Flethuseo

+0

Juste au cas où quelqu'un chercher quelque chose de similaire, j'ai trouvé un tas d'exemples de réseaux de neurones et d'IA ici: gems/ai4r-1.9/examples/ – Flethuseo

2

Si vous voulez considérer Neuroevolution, vous pouvez consulter la gemme neuroevo. Exécutez les spécifications pour voir adapter XOR en 15 itérations ([2,2,1] réseau feed-forward, optimiseur XNES):

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

divulgation complète: Je suis le développeur (salut là!).
J'ai récemment commencé à publier mon code et je suis à la recherche de commentaires.