J'ai construit un MLP avec la bibliothèque TensorFlow de Google. Le réseau fonctionne mais refuse d'apprendre correctement. Il converge toujours vers une sortie de près de 1,0, peu importe ce que l'entrée est réellement.TensorFlow MLP pas de formation XOR
Le code complet peut être vu here.
Des idées?
L'entrée et sortie (taille du lot 4) est la suivante:
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")
configuration de couche cachée:
# 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)
configuration de la couche de sortie:
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
Mon apprentissage méthodes ressemblent à ceci:
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
J'ai essayé deux configurations pour entropie croisée:
cross_entropy = -tf.reduce_sum(n_output * tf.log(output))
et
cross_entropy = tf.nn.sigmoid_cross_entropy_with_logits(n_output, output)
où n_output
est la sortie d'origine tel que décrit dans output_data
et output
la valeur prédite/calculée par mon réseau.
La formation dans la boucle for (pour les époques n) va comme ceci:
cvalues = sess.run([train, loss, W_hidden, b_hidden, W_output],
feed_dict={n_input: input_data, n_output: output_data})
Je sauve le résultat à CVALUES pour printig de débogage de loss
, W_hidden
, ...
Peu importe ce que j'ai essayé, quand je teste mon réseau, en essayant de valider la sortie, il produit toujours quelque chose lik e ceci:
(...)
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]]
Il n'est pas apprendre correctement, mais toujours converger à près de 1,0, peu importe quelle entrée est alimentée.
Votre variable 'b_hidden' est un scalaire - est-ce intentionnel? Je pense que vous devriez le créer comme 'b_hidden = tf.Variable (tf.constant (0.1, forme = [hidden_nodes]), name =" hidden_bias ")', ce qui pourrait aider. Une autre chose à essayer serait d'ajouter un terme de biais 'b_output' à votre couche de sortie. – mrry
Merci pour le commentaire. En effet, je n'ai juste pas remarqué que 'b_hidden' devrait aussi être un vecteur et non un scalaire ... cependant, le réseau converge toujours vers presque 1.0 pour chaque entrée, avec ou sans biais caché, comme un scalaire ou un vecteur et avec ou sans biais pour la couche de sortie. Je pense vraiment que je manque une erreur dans la méthode d'apprentissage ou l'architecture réseau:/ – daniel451