6

Sto cercando di addestrare una rete feedforward affinché funzioni per eseguire operazioni XOR con la libreria AI4R di Ruby. Tuttavia, quando valuto per lo XOR dopo l'allenamento. Non sto ottenendo l'output corretto. Qualcuno ha usato questa libreria prima dello e l'ha ricevuta per imparare l'operazione XOR.Rete neurale di addestramento per XOR in Ruby

Sto usando due neuroni di input, tre neuroni in uno strato nascosto e uno strato per l'output, come ho visto una rete neurale precoce di alimentazione di tipo XOR come in precedenza.

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

potresti essere interessato a questa risposta: http://stackoverflow.com/a/38767930/5082406 –

risposta

5

Non hai addestrato per numero sufficiente di iterazioni. Se si modifica 400.times a 8000.times, si arriverà molto più vicino (e ancora più vicino a 20000.times).

A 20000.times, ottengo

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 

È possibile anche aumentare net.learning_rate (ma non troppo).

+0

Mi chiedo perché è così lento. – Flethuseo

+1

Hmmm. interessante .. avevo provato al massimo 4000 iterazioni .. e avevo visto un lavoro di propagazione posteriore abbastanza bene con quella quantità. Non mi sono preoccupato di provare così tante iterazioni :). Ho notato che funziona un po 'meglio con un tasso di apprendimento di 1. – Flethuseo

+0

Nel caso qualcuno cerchi qualcosa di simile, ho trovato un sacco di esempi per reti neurali e roba artificiale qui: gemme/ai4r-1.9/esempi/ – Flethuseo

2

Se si desidera considerare Neuroevolution, è possibile controllare la gemma neuroevo. Eseguire le specifiche per vederlo adatta XOR in 15 iterazioni (rete [2,2,1] feed-forward, XNES Optimizer):

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

Full disclosure: io sono lo sviluppatore (Hi there!).
Ho appena iniziato a pubblicare il mio codice e sto cercando feedback.

Problemi correlati