Profonde de l'Apprentissage Nan raisons de perte de

peut-être une question trop générale, mais est-ce que quelqu'un peut expliquer ce qui causerait la divergence D'un réseau neuronal convolutionnel?

Détails:

j'utilise le modèle iris_training de Tensorflow avec certaines de mes propres données et je continue à obtenir

erreur: tensorflow: le modèle divergeait avec loss = NaN.

Traceback...

tensorflow.contrib.apprendre.Python.apprendre.surveiller.NanLossDuringTrainingError: NaN perte au cours de formation.

Traceback origine avec la ligne:

 tf.contrib.learn.DNNClassifier(feature_columns=feature_columns,
                                        hidden_units=[300, 300, 300],
                                        #optimizer=tf.train.ProximalAdagradOptimizer(learning_rate=0.001, l1_regularization_strength=0.00001),                                                          
                                        n_classes=11,
                                        model_dir="/tmp/iris_model")

j'ai essayé d'ajuster l'optimiseur, en utilisant un zéro pour le taux d'apprentissage, et en n'utilisant aucun optimiseur. Tout aperçu des couches réseau, de la taille des données, etc. est apprécié.

24
demandé sur Zroach 2016-10-14 22:07:18

4 réponses

Il y a beaucoup de choses que j'ai vu faire un modèle divergent.

  1. taux D'apprentissage trop élevé. Vous pouvez dire si c'est le cas si la perte commence à augmenter, puis diverge à l'infini.

  2. Je ne suis pas familier avec le DNNClassifier mais je devine qu'il utilise la fonction de coût d'entropie croisée catégorique. Il s'agit de prendre le logarithme de la prédiction qui diverge lorsque la prédiction approche zéro. C'est pourquoi les gens généralement ajouter une petite valeur epsilon à la prédiction pour prévenir cette divergence. Je devine que le DNNClassifier fait probablement ceci ou utilise le TensorFlow opp pour cela. Probablement pas le problème.

  3. D'autres problèmes de stabilité numérique peuvent exister comme la division par zéro où l'ajout de l'epsilon peut aider. Une autre moins évidente si la racine carrée qui est dérivée peut diverger si elle n'est pas correctement simplifiée en traitant des nombres finis de précision. Encore une fois je doute que cela soit la question dans le cas du Classificateur à la LNNTE.

  4. Vous pouvez avoir un problème avec les données d'entrée. Essayez d'appeler assert not np.any(np.isnan(x)) sur les données d'entrée pour s'assurer que vous n'introduisez pas la nan. Assurez-vous également que toutes les valeurs sont valides. Enfin, assurez-vous que les données sont correctement normalisé. Vous souhaitez probablement les pixels dans l'intervalle [-1, 1], [0, 255].

  5. les étiquettes doivent être dans le domaine de la fonction de perte, donc si vous utilisez un fonction de perte basée sur la logarithme toutes les étiquettes doivent être non négatives (tel que noté par evan pu et les commentaires ci-dessous).

38
répondu chasep255 2018-04-30 00:42:38

si vous vous entraînez pour l'entropie croisée, vous voulez ajouter un petit nombre comme 1e-8 à votre Probabilité de sortie.

parce que log( 0) est l'infini négatif, quand votre modèle est suffisamment entraîné la distribution de sortie sera très asymétrique, par exemple dire que je fais une sortie de classe 4, Au début ma probabilité ressemble à

0.25 0.25 0.25 0.25

mais vers la fin, la probabilité sera probablement ressembler à

1.0 0 0 0
3
répondu Evan Pu 2017-07-27 00:45:00

si vous utilisez des entiers comme cibles, assurez-vous qu'ils ne sont pas symétriques à 0.

0
répondu yper 2017-07-14 09:13:07

si vous souhaitez recueillir plus d'informations sur l'erreur et si l'erreur se produit dans les premières itérations, je vous suggère d'exécuter l'expérience en mode CPU seulement (Pas de GPUs). Le message d'erreur sera beaucoup plus spécifique.

Source:https://github.com/tensorflow/tensor2tensor/issues/574

0
répondu Kevin Johnsrude 2018-06-14 18:40:42