SensorFlow MLP trainiert kein XOR

Ich habe ein MLP mit Googles @ geba TensorFlow Bibliothek. Das Netzwerk funktioniert, lernt aber nicht richtig. Es konvergiert immer zu einer Ausgabe von fast 1,0, unabhängig davon, um welche Eingabe es sich handelt.

Dascomplete code kann gesehen werdenHie.

Irgendwelche Ideen

DasEingabe und Ausgabe (Losgröße 4) lautet wie folgt:

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")

Versteckte Layerkonfiguration:

# 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)

Output Layer Konfiguration:

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

MyLerne Methoden sehen so aus:

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

Ich habe beide Setups für @ ausprobiecross entropy:

cross_entropy = -tf.reduce_sum(n_output * tf.log(output))

un

cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output)

won_output ist die ursprüngliche Ausgabe wie in @ beschrieboutput_data undoutput der von meinem Netzwerk vorhergesagte / berechnete Wert.

Dastraining innerhalb der for-Schleife (für n Epochen) geht so:

cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
                   feed_dict={n_input: input_data, n_output: output_data})

Ich speichere das Ergebnis in cWerte für den Debug-Ausdruck vonloss, W_hidden, ...

Egal was ich versucht habe, wenn ich mein Netzwerk teste und versuche, die Ausgabe zu validieren, wird immer so etwas erzeugt:

(...)
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]]

So dass esist nich richtig lernen, aber immer auf fast 1,0 konvergieren, egal welcher Eingang eingespeist wird.

Antworten auf die Frage(4)

Ihre Antwort auf die Frage