2017-05-02 1 views
0

Je commence avec TensorFlow. Pendant que j'évaluais plusieurs fois comment voir les données, J'ai trouvé que la perte change avec les exécutions.Plusieurs exécutions de l'évaluation donnent différentes pertes dans TensorFlow

eval_input_fn = tf.contrib.learn.io.numpy_input_fn({"x":x}, y, batch_size=4, 
              num_epochs=1) 
estimator.evaluate(input_fn = eval_input_fn) 

Par exemple, j'ai eu des pertes suivantes:

0,024675447 ou 0,030844312 quand batch_size == 2, num_epochs == 2

0.020562874 ou 0.030844312 lorsque batch_size == 4, num_epochs == 2

0,015422156 0,030844312 ou lorsque batch_size == 4, num_epochs == 1

Ce phénomène est-il normal? Je ne comprends pas le principe derrière cela.

--- le suivant ajouté

La même chose se produit lorsque j'utilise next_batch et eval() sans recyclage comme dans https://www.tensorflow.org/get_started/mnist/pros. Quand je lance la cellule suivante:

# mnist.test.labels.shape: (10000, 10) 
for i in range(10): 
    batch = mnist.test.next_batch(1000) 
    print("test accuracy %g"%accuracy.eval(feed_dict={ 
     x: batch[0], y_: batch[1], keep_prob: 1.0})) 

Je suis

a)

précision du test 0,99

précision du test 0,997

précision du test 0,986

précision du test 0,993

essai précision 0,994

essai précision 0,993

essai précision 0,995

essai précision 0,995

essai précision 0,99

essai précision 0,99

b)

précision essai 0,99

de la précision du test 0,997

de la précision du test 0,989

de la précision du test 0,992

de la précision du test 0,993

de la précision du test 0,992

de la précision du test 0.994

précision du test 0,993

test de précision 0,993

test de précision 0,99

et ils (et leur moyenne) ne cessent de changer.

Répondre

0

Ceci est très normal, et exploité dans de nombreux articles même.

La première chose à noter est que vous commencez avec des poids initialisés de façon aléatoire. Si vous vous entraînez plusieurs fois, vous trouverez une moyenne et une variance à vos résultats, souvent de nombreux points de différence de précision dans les problèmes de classification communs. Il est très normal de s'entraîner plusieurs fois et de choisir le meilleur résultat. Vous devez être conscient que cela permet d'adapter votre modèle à vos données de test (vous choisissez le meilleur qui pourrait avoir eu de la chance sur ces données de test en particulier sans promettre de généraliser à d'autres données non vues). C'est pourquoi vous utilisez des données de train/validation/test. Train sur données train, validez les paramètres sur validation données avec beaucoup d'itérations de formation, puis publiez uniquement des résultats sur vos données test qui n'ont pas été utilisées dans plus d'une itération.

Vous avez également noté des différences avec des tailles de lots variables. J'ai trouvé dans mes propres expériences que la taille du lot est en fait un régularisateur. Dans les cas où j'ai eu beaucoup de données et n'a pas eu de problèmes de sur-ajustement, lorsque j'essaie différentes tailles de lots, les meilleurs résultats proviennent de grandes tailles de lots. Cependant, lorsque j'ai peu de données et que j'ai besoin de plus de régulariser la sélection, les lots de plus petite taille ont tendance à produire de meilleurs résultats. La raison: des tailles de lots plus petites induisent plus de hasard dans le processus d'optimisation, facilitant l'évasion des minima locaux, des tailles de lots plus grandes font un meilleur travail pour approcher le vrai gradient (vous êtes plus susceptible d'aller dans la bonne direction à chaque étape).

Une façon cette question est exploitée: Vous pouvez trouver des articles académiques qui décrivent les techniques de vote, où les gens vont former un réseau de neurones à plusieurs reprises et de prendre chacun d'eux comme un seul vote, ceux-ci ont souvent fait très bien. Prenez un peu plus loin et vous pourriez choisir des réseaux qui font des erreurs différentes pour obtenir le meilleur ensemble de réseaux.

Notez que parmi les meilleurs résultats sur l'ensemble de données manuscrites MNIST énumérées sur la page de LeCun est un comité de 35 réseaux de neurones convolutifs votés.

http://yann.lecun.com/exdb/mnist/

+0

Merci pour votre réponse, mais je pense qu'il ya un malentendu. J'ai séparé la phase d'évaluation de la phase d'adaptation, de sorte que l'entraînement n'est exécuté qu'une seule fois. Seule cette ligne 'estimator.evaluate (input_fn = eval_input_fn)' est exécutée plusieurs fois, puis j'ai des pertes différentes quelle que soit la taille du lot ou le nombre d'époques que je donne. En fait, je ne comprends pas pourquoi nous avons la taille du lot et le nombre d'époques dans l'évaluation. –