Ho costruito un MLP con la libreria di Google TensorFlow. La rete funziona ma in qualche modo si rifiuta di apprendere correttamente. Converge sempre in un output di circa 1,0 indipendentemente dal fatto che l'input sia effettivamente.tensorflow MLP non si allena XOR
Il codice completo può essere visto here.
Qualche idea?
Il ingresso e uscita (dimensione del lotto 4) è il seguente:
input_data = [[0., 0.], [0., 1.], [1., 0.], [1., 1.]] # XOR input
output_data = [[0.], [1.], [1.], [0.]] # XOR output
n_input = tf.placeholder(tf.float32, shape=[None, 2], name="n_input")
n_output = tf.placeholder(tf.float32, shape=[None, 1], name="n_output")
configurazione strato nascosto:
# hidden layer's bias neuron
b_hidden = tf.Variable(0.1, name="hidden_bias")
# hidden layer's weight matrix initialized with a uniform distribution
W_hidden = tf.Variable(tf.random_uniform([2, hidden_nodes], -1.0, 1.0), name="hidden_weights")
# calc hidden layer's activation
hidden = tf.sigmoid(tf.matmul(n_input, W_hidden) + b_hidden)
configurazione uscita strato:
W_output = tf.Variable(tf.random_uniform([hidden_nodes, 1], -1.0, 1.0), name="output_weights") # output layer's weight matrix
output = tf.sigmoid(tf.matmul(hidden, W_output)) # calc output layer's activation
mio apprendimento metodi simile a questa:
loss = tf.reduce_mean(cross_entropy) # mean the cross_entropy
optimizer = tf.train.GradientDescentOptimizer(0.01) # take a gradient descent for optimizing
train = optimizer.minimize(loss) # let the optimizer train
ho provato entrambe le configurazioni per entropia croce:
cross_entropy = -tf.reduce_sum(n_output * tf.log(output))
e
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output)
dove n_output
è l'uscita originale come descritto in output_data
e output
il valore previsto/calcolato mia rete.
Il formazione all'interno del ciclo for (per n epoche) va in questo modo:
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
feed_dict={n_input: input_data, n_output: output_data})
Mi risparmio il risultato di cvalues per il debug printig di loss
, W_hidden
, ...
Non importa quello che ho provato, quando provo la mia rete, provando a convalidare l'output, produce sempre qualcosa di simile e questo:
(...)
step: 2000
loss: 0.0137040186673
b_hidden: 1.3272010088
W_hidden: [[ 0.23195425 0.53248233 -0.21644847 -0.54775208 0.52298909]
[ 0.73933059 0.51440752 -0.08397482 -0.62724304 -0.53347367]]
W_output: [[ 1.65939867]
[ 0.78912479]
[ 1.4831928 ]
[ 1.28612828]
[ 1.12486529]]
(--- finished with 2000 epochs ---)
(Test input for validation:)
input: [0.0, 0.0] | output: [[ 0.99339396]]
input: [0.0, 1.0] | output: [[ 0.99289012]]
input: [1.0, 0.0] | output: [[ 0.99346077]]
input: [1.0, 1.0] | output: [[ 0.99261558]]
Quindi non è apprendimento correttamente ma sempre convergenti a quasi 1,0 non importa quale ingresso è alimentato.
vostro 'variabile b_hidden' è uno scalare - è intenzionale? Penso che dovresti crearlo come 'b_hidden = tf.Variable (tf.constant (0.1, shape = [hidden_nodes]), name =" hidden_bias ")', che potrebbe aiutare. Un'altra cosa da provare sarebbe aggiungere un termine di bias 'b_output' al livello di output. – mrry
Grazie per il commento. In effetti, non sono riuscito a notare che 'b_hidden' dovrebbe essere anche un vettore e non uno scalare ... tuttavia, la rete converge ancora a quasi 1.0 per ogni input, con o senza un bias nascosto, come scalare o un vettore e con o senza pregiudizi per il livello di output. Penso davvero che mi manchi qualche errore nel metodo di apprendimento o nell'architettura di rete:/ – daniel451