Ich habe ein MLP mit Googles TensorFlow Bibliothek gebaut. Das Netzwerk funktioniert, aber irgendwie weigert es sich, richtig zu lernen. Es konvergiert immer zu einer Ausgabe von fast 1,0, egal was die Eingabe tatsächlich ist.TensorFlow MLP kein Training XOR
Der vollständige Code kann here gesehen werden.
Irgendwelche Ideen?
Die Eingangs- und Ausgangs (Ansatzgröße 4) ist 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")
verborgene Schicht Konfiguration:
# 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)
Ausgangsschichtkonfiguration:
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
Meine Lernen Methoden wie folgt aussehen:
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 versucht, beide Setups für Kreuzentropie:
cross_entropy = -tf.reduce_sum(n_output * tf.log(output))
und
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output)
wo n_output
die ursprüngliche Ausgabe ist, wie in output_data
output
und der vorausgesagte/berechnete Wert durch mein Netzwerk beschrieben.
Die Ausbildung 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 bin das Ergebnis zu cvalues für Debug printig von loss
Speichern W_hidden
, ...
Egal was ich versucht habe, wenn ich mein Netzwerk teste, versuche, die Ausgabe zu validieren, produziert es immer etwas lik e dies:
(...)
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]]
es also ist nicht richtig Lernen aber immer auf fast 1,0 egal konvergierenden die Eingangszugeführt wird.
Ihre 'b_hidden' Variable ein Skalar ist - ist das Absicht? Ich denke, Sie sollten es als 'b_hidden = tf.Variable (tf.constant (0.1, shape = [hidden_nodes]), name =" hidden_bias ")' erstellen, was helfen könnte. Eine andere Sache, die Sie ausprobieren sollten, wäre, einen 'b_output'-Bias-Ausdruck zu Ihrer Ausgabeschicht hinzuzufügen. – mrry
Vielen Dank für den Kommentar. In der Tat habe ich nicht bemerkt, dass "b_hidden" auch ein Vektor und kein Skalar sein sollte ... das Netzwerk konvergiert jedoch immer noch für jede Eingabe auf fast 1.0, mit oder ohne versteckten Bias, als Skalar oder Vektor und mit oder ohne eine Vorspannung für die Ausgabeschicht. Ich glaube wirklich, dass mir ein Fehler in der Lernmethode oder Netzwerkarchitektur fehlt:/ – daniel451