2017-04-24 3 views
2

J'ai commencé avec tensorflow et j'ai suivi cette norme MNIST tutorial.Tensorflow MNIST tutoriel - Précision de test très faible

Cependant, contrairement à la précision attendue de 92%, la précision obtenue sur l'ensemble d'apprentissage ainsi que sur l'ensemble de test ne dépasse pas 67%. Je suis familier avec la régression softmax et multinomiale et ai obtenu plus de 94% en utilisant l'implémentation de python scratch aussi bien qu'en utilisant sklearn.linear_model.LogisticRegression. J'avais essayé la même chose avec l'ensemble de données CIFAR-10 et dans ce cas, la précision était trop faible et juste environ 10%, ce qui équivaut à assigner des classes au hasard. Cela m'a fait douter de mon installation de tensorflow, mais je ne suis pas sûr de cela.

Voici my implementation of Tensorflow MNIST tutorial. Je demanderais à quelqu'un de jeter un coup d'œil à ma mise en œuvre.

Répondre

3

Vous avez construit votre graphique, spécifié la fonction de perte et créé l'optimiseur (ce qui est correct). Le problème est que vous n'utilisez votre optimiseur qu'une seule fois:

sess_tf.run(train_step, feed_dict={x: train_images_reshaped[0:1000], y_: train_labels[0:1000]}) 

Donc, fondamentalement, vous ne lancez votre descente de dégradé qu'une seule fois. Il est clair que vous ne pouvez pas converger rapidement après seulement un petit pas dans la bonne direction. Vous devez faire quelque chose le long des lignes:

for _ in xrange(many_steps): 
    X, Y = get_a_new_batch_from(mnist_data) 
    sess_tf.run(train_step, feed_dict={x: X, y_: Y}) 

Si vous ne pouvez pas de savoir comment modifier mon pseudo-code, consultez le tutoriel, car en fonction de ma mémoire ils ont couvert ce bien.

+0

Merci de l'avoir signalé. Étant descente en dégradé par lots dans le tutoriel, j'avais pensé que je n'avais pas besoin de l'itération et que j'ignorais complètement le concept de convergence. Ont fait le changement et c'est comme prévu. – codeahead

0
W = tf.Variable(tf.zeros([784, 10])) 
b = tf.Variable(tf.zeros([10])) 

L'initialisation de W peut causer votre réseau n'apprend rien mais devinettes au hasard. Parce que le grad sera nul et le backprop ne fonctionne pas du tout.

Vous feriez mieux d'initier le W en utilisant tf.Variable(tf.truncated_normal([784, 10], mean=0.0, stddev=0.01)) voir https://www.tensorflow.org/api_docs/python/tf/truncated_normal pour plus d'informations.

+0

J'avais essayé cette approche et cela n'a pas fonctionné aussi bien et la raison a été identifiée par @Salvador Dali. – codeahead