158 votes

Apprentissage en profondeur des raisons de perte de nan

Peut-être trop général une question, mais quelqu'un peut-il expliquer ce que serait la cause d'un Réseau de Neurones à Convolution à diverger?

Spécificités:

Je suis à l'aide de Tensorflow de iris_training modèle avec certains de mes propres données et reçois

ERREUR:tensorflow:Modèle divergé avec perte = NaN.

Traceback...

tensorflow.contrib.apprendre.python.apprendre.les moniteurs.NanLossDuringTrainingError: NaN perte au cours de la 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é le réglage de l'optimiseur, à l'aide d'un zéro pour l'apprentissage de taux, et utilisant l'optimiseur. Des idées dans les couches du réseau, la taille des données, etc est apprécié.

228voto

chasep255 Points 5088

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

  1. Trop haut, au taux d'apprentissage. Vous pouvez dire si c'est le cas si la perte commence à augmenter, puis diverge à l'infini.

  2. Je ne suis pas familiers avec le DNNClassifier, mais je devine qu'il utilise les catégorique de la croix de l'entropie de la fonction de coût. Il s'agit de prendre le journal de la prédiction, qui diverge selon la prédiction se rapproche de zéro. C'est pourquoi les gens l'habitude d'ajouter un petit epsilon de la valeur de la prédiction pour empêcher cette divergence. Je suppose que le DNNClassifier probablement ce soit le cas ou utilise le tensorflow opp pour elle. Probablement pas le problème.

  3. D'autres numérique des problèmes de stabilité peuvent exister comme une division par zéro, d'où l'ajout de l'epsilon peut vous aider. Une autre, moins évidente si la racine carrée de l'oms dérivés peuvent diverger si pas correctement simplifiée lorsque l'on traite avec précision finie de nombres. Encore une fois je doute que cela soit le problème dans le cas de la DNNClassifier.

  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 assurez-vous que vous n'êtes pas l'introduction de 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] et non [0, 255].

  5. Les étiquettes doivent être dans le domaine de la perte de la fonction, donc si à l'aide d'une échelle logarithmique de base de la perte de la fonction de toutes les étiquettes doivent être non négatif (comme indiqué par evan pu et les commentaires ci-dessous).

24voto

Evan Pu Points 828

Si vous êtes de formation pour les croix, l'entropie, vous voulez ajouter un petit nombre comme 1e-8 à votre sortie de probabilité.

Parce que log(0) est l'infini négatif, lorsque votre modèle insuffisamment formés à la sortie de la distribution très asymétrique, par exemple, dire que je suis en train de faire un 4 de sortie de classe, au début mon probabilité ressemble

0.25 0.25 0.25 0.25

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

1.0 0 0 0

Et vous prenez une croix de l'entropie de cette distribution tout va exploser. La solution est de artifitially ajouter un petit nombre de toutes les conditions pour l'en empêcher.

5voto

yper Points 443

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

C'est-à-dire, n'utilisez pas les classes -1, 0, 1. Utilisez à la place 0, 1, 2.

3voto

Kevin Johnsrude Points 140

Si vous souhaitez collecter plus d'informations sur l'erreur et si l'erreur se produit au cours des premières itérations, je vous suggère d'exécuter le test en mode CPU uniquement (sans GPU). Le message d'erreur sera beaucoup plus spécifique.

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X