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.