train test machine learning intensivo google datos curso automático automatico aprendizaje aprender acelerado python theano keras

python - machine - datos train y test



Pérdida de NaN al entrenar la red de regresión. (6)

Es difícil trabajar con la regresión con redes neuronales porque la salida no tiene límites, por lo que es especialmente propenso al problema de los gradientes explosivos (la causa probable de los nans).

Históricamente, una solución clave para explotar gradientes era reducir la tasa de aprendizaje, pero con la llegada de los algoritmos de tasa de aprendizaje adaptativo por parámetro como Adam, ya no es necesario establecer una tasa de aprendizaje para obtener un buen rendimiento. Hay muy pocas razones para usar SGD con impulso a menos que sea un demonio de la red neuronal y sepa cómo ajustar el programa de aprendizaje.

Aquí hay algunas cosas que podrías probar:

  1. Normalice sus salidas mediante la cuantificación de cuantiles o la puntuación z . Para ser riguroso, calcule esta transformación en los datos de entrenamiento, no en el conjunto de datos completo. Por ejemplo, con la normalización de cuantiles, si un ejemplo se encuentra en el percentil 60 del conjunto de entrenamiento, obtiene un valor de 0.6. (También puede cambiar los valores normalizados de los cuantiles hacia abajo en 0,5 para que el percentil 0 sea -0,5 y el percentil 100 sea +0,5).

  2. Agregue la regularización, ya sea aumentando la tasa de deserción o agregando penalizaciones de L1 y L2 a los pesos. La regularización de L1 es análoga a la selección de características, y como dijo que reducir el número de características a 5 proporciona un buen rendimiento, L1 también puede hacerlo.

  3. Si esto todavía no ayuda, reduce el tamaño de tu red. Esta no es siempre la mejor idea, ya que puede dañar el rendimiento, pero en su caso, tiene una gran cantidad de neuronas de primera capa (1024) en relación con las funciones de entrada (35), por lo que puede ser útil.

  4. Aumente el tamaño del lote de 32 a 128. 128 es bastante estándar y podría aumentar la estabilidad de la optimización.

Tengo una matriz de datos en "One-Hot Encoding" (todos unos y ceros) con 260,000 filas y 35 columnas. Estoy usando Keras para entrenar una red neuronal simple para predecir una variable continua. El código para hacer la red es el siguiente:

model = Sequential() model.add(Dense(1024, input_shape=(n_train,))) model.add(Activation(''relu'')) model.add(Dropout(0.1)) model.add(Dense(512)) model.add(Activation(''relu'')) model.add(Dropout(0.1)) model.add(Dense(256)) model.add(Activation(''relu'')) model.add(Dropout(0.1)) model.add(Dense(1)) sgd = SGD(lr=0.01, nesterov=True); #rms = RMSprop() #model.compile(loss=''categorical_crossentropy'', optimizer=rms, metrics=[''accuracy'']) model.compile(loss=''mean_absolute_error'', optimizer=sgd) model.fit(X_train, Y_train, batch_size=32, nb_epoch=3, verbose=1, validation_data=(X_test,Y_test), callbacks=[EarlyStopping(monitor=''val_loss'', patience=4)] )

Sin embargo, durante el proceso de entrenamiento, veo que la pérdida disminuye muy bien, pero durante la mitad de la segunda época, se reduce a:

Train on 260000 samples, validate on 64905 samples Epoch 1/3 260000/260000 [==============================] - 254s - loss: 16.2775 - val_loss: 13.4925 Epoch 2/3 88448/260000 [=========>....................] - ETA: 161s - loss: nan

Intenté usar RMSProp lugar de SGD , probé tanh lugar de relu , lo intenté con y sin deserción, todo en vano. Lo intenté con un modelo más pequeño, es decir, con una sola capa oculta, y el mismo problema (se convierte en nanotecnología en un punto diferente). Sin embargo, funciona con menos características, es decir, si solo hay 5 columnas, y ofrece predicciones bastante buenas. Parece que hay algún tipo de desbordamiento, pero no puedo imaginar por qué: la pérdida no es demasiado grande en absoluto.

Python versión 2.7.11, que se ejecuta en una máquina Linux, solo CPU. Lo probé con la última versión de Theano, y también obtengo Nans, así que intenté ir a Theano 0.8.2 y tengo el mismo problema. Con la última versión de Keras tiene el mismo problema, y ​​también con la versión 0.3.2.


Estaba perdiendo la pérdida como nan en la primera época, tan pronto como comienza el entrenamiento. Solución tan simple como eliminar el nas de los datos de entrada que funcionaron para mí (df.dropna ())

Espero que esto ayude a alguien con problemas similares.


Intenté cada sugerencia en esta página y muchas otras en vano. Importábamos archivos csv con pandas, y luego keras Tokenizer con entrada de texto para crear vocabularios y matrices de vectores de palabras. Después de notar que algunos archivos CSV llevaron a nan mientras otros trabajaban, de repente observamos la codificación de los archivos y nos dimos cuenta de que los archivos ascii NO funcionaban con keras, lo que 0.0000e+00 como resultado una pérdida y precisión de 0.0000e+00 ; sin embargo, los archivos utf-8 y utf-16 estaban funcionando ! Penetración.

Si está realizando un análisis textual y está perdiendo nan después de probar estas sugerencias, use el file -i {input} (linux) o el file -I {input} (osx) para descubrir su tipo de archivo. Si tiene ISO-8859-1 o us-ascii , intente convertir a utf-8 o utf-16le . No he intentado esto último, pero me imagino que también funcionaría. Esperemos que esto ayude a alguien muy muy frustrado!


La respuesta por 1 "es bastante buena. Sin embargo, todos los arreglos parecen solucionar el problema indirectamente en lugar de hacerlo directamente. Recomendaría el uso de recorte de degradado, que simplemente recortará cualquier degradado que esté por encima de cierto valor.

En Keras puede usar clipnorm=1 (consulte https://keras.io/optimizers/ ) para simplemente recortar todos los gradientes con una norma por encima de 1.


Me enfrenté a un problema muy similar, y así es como lo ejecuté.

Lo primero que puedes intentar es cambiar tu activación a LeakyReLU en lugar de usar Relu o Tanh. La razón es que a menudo, muchos de los nodos dentro de sus capas tienen una activación de cero, y la propagación hacia atrás no actualiza los pesos de estos nodos porque su gradiente también es cero. Esto también se conoce como el problema ''Reying moribundo'' (puede leer más sobre esto aquí: https://datascience.stackexchange.com/questions/5706/what-is-the-dying-relu-problem-in-neural-networks ).

Para hacer esto, puedes importar la activación de LeakyReLU usando:

from keras.layers.advanced_activations import LeakyReLU

e incorporalo dentro de tus capas como esta:

model.add(Dense(800,input_shape=(num_inputs,))) model.add(LeakyReLU(alpha=0.1))

Además, es posible que la característica de salida (la variable continua que está tratando de predecir) sea un conjunto de datos desequilibrado y tenga demasiados 0s. Una forma de solucionar este problema es usar suavizado. Puede hacer esto sumando 1 al numerador de todos sus valores en esta columna y dividiendo cada uno de los valores en esta columna por 1 / (promedio de todos los valores en esta columna)

Básicamente, esto cambia todos los valores de 0 a un valor mayor que 0 (que aún puede ser muy pequeño). Esto evita que la curva prediga 0s y minimice la pérdida (eventualmente haciéndolo NaN). Los valores más pequeños se ven más afectados que los valores más grandes, pero en general, el promedio del conjunto de datos sigue siendo el mismo.


Me enfrenté al mismo problema antes. Busco y encuentro esta pregunta y respuestas. Todos los trucos mencionados anteriormente son importantes para entrenar una red neuronal profunda. Los probé todos, pero aún así obtuve NAN.

También encuentro esta pregunta aquí. https://github.com/fchollet/keras/issues/2134 . Cité el resumen del autor de la siguiente manera: “Quería señalarlo para que esté archivado para otros que puedan tener este problema en el futuro. Me estaba topando con mi función de pérdida, volviendo repentinamente un nan después de que llegara tan lejos en el proceso de entrenamiento. Verifiqué el relus, el optimizador, la función de pérdida, mi abandono de acuerdo con el relé, el tamaño de mi red y la forma de la red. Todavía estaba sufriendo una pérdida que eventualmente se convirtió en un nan y me estaba sintiendo bastante frustrada.

Entonces me di cuenta. Puede que tenga alguna mala entrada. Resulta que una de las imágenes que le entregué a mi CNN (y haciendo normalización media) no era más que 0. No estaba revisando este caso cuando resté la media y me normalicé por la desviación estándar y, por lo tanto, terminé con una matriz ejemplar que no era más que la de Nan. Una vez que arreglé mi función de normalización, mi red ahora se entrena perfectamente ".

Estoy de acuerdo con el punto de vista anterior: la entrada es sensible para su red. En mi caso, uso el valor de registro de la estimación de densidad como entrada. El valor absoluto puede ser muy grande, lo que puede resultar en NaN después de varios pasos de gradientes. Creo que la verificación de entrada es necesaria. Primero, debe asegurarse de que la entrada no incluya -inf o inf , o algunos números extremadamente grandes en valor absoluto.