tutorial instalar example español python tensorflow machine-learning keras theano

python - instalar - Profundas razones para la pérdida de Nan



keras wikipedia (4)

Tal vez sea una pregunta demasiado general, pero ¿puede alguien explicar qué causaría la divergencia de una red neuronal convolucional?

Detalles específicos:

Estoy usando el modelo de entrenamiento de iris de Tensorflow con algunos de mis propios datos y sigo recibiendo

ERROR: tensorflow: Modelo divergido con pérdida = NaN.

Rastrear...

tensorflow.contrib.learn.python.learn.monitors.NanLossDuringTrainingError: pérdida de NaN durante el entrenamiento.

Traceback originado con línea:

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")

He intentado ajustar el optimizador, usando un cero para la velocidad de aprendizaje y sin usar ningún optimizador. Cualquier información sobre las capas de red, el tamaño de los datos, etc. se agradece.


Hay muchas cosas que he visto hacer que un modelo diverge.

  1. Demasiado alto de una tasa de aprendizaje. A menudo se puede decir si este es el caso si la pérdida comienza a aumentar y luego se desvía hasta el infinito.

  2. No estoy familiarizado con el DNNClassifier pero supongo que utiliza la función de costo categórico de entropía cruzada. Esto implica tomar el registro de la predicción que diverge a medida que la predicción se acerca a cero. Es por eso que las personas suelen agregar un pequeño valor épsilon a la predicción para evitar esta divergencia. Supongo que el DNNClassifier probablemente haga esto o use el opp tensorflow para ello. Probablemente no sea el problema.

  3. Pueden existir otros problemas de estabilidad numérica, como la división por cero, donde la adición de épsilon puede ayudar. Otro menos obvio si la raíz cuadrada que deriva puede divergir si no se simplifica adecuadamente al tratar con números de precisión finitos. Una vez más, dudo que este sea el problema en el caso del DNNClassifier.

  4. Puede tener un problema con los datos de entrada. Intente llamar a assert not np.any(np.isnan(x)) en los datos de entrada para asegurarse de que no está introduciendo el nan. También asegúrese de que todos los valores de destino son válidos. Finalmente, asegúrese de que los datos estén correctamente normalizados. Probablemente desee tener los píxeles en el rango [-1, 1] y no [0, 255].

  5. Las etiquetas deben estar en el dominio de la función de pérdida, por lo tanto, si se usa una función de pérdida basada en logarítmica, todas las etiquetas deben ser no negativas (como lo indica evan pu y los comentarios a continuación).


Si desea recopilar más información sobre el error y si el error se produce en las primeras iteraciones, le sugiero que ejecute el experimento en modo solo CPU (no GPU). El mensaje de error será mucho más específico.

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


Si está entrenando para la entropía cruzada, desea agregar un número pequeño como 1e-8 a su probabilidad de salida.

Debido a que log (0) es infinito negativo, cuando su modelo esté lo suficientemente entrenado, la distribución de salida será muy sesgada, por ejemplo, digamos que estoy haciendo una salida de 4 clases, al principio mi probabilidad parece ser

0.25 0.25 0.25 0.25

pero hacia el final la probabilidad probablemente se verá como

1.0 0 0 0

Y si tomas una entropía cruzada de esta distribución todo explotará. La solución es agregar artificialmente un pequeño número a todos los términos para evitar esto.


Si usa enteros como objetivos, asegúrese de que no sean simétricos en 0.

Es decir, no use las clases -1, 0, 1. En su lugar, use 0, 1, 2.