tutorial instalar gridsearchcv example español classifier python numpy theano keras

python - instalar - keras wikipedia



Cómo obtener resultados reproducibles en keras (7)

Esto funciona para mi:

SEED = 123456 import os import random as rn import numpy as np from tensorflow import set_random_seed os.environ[''PYTHONHASHSEED'']=str(SEED) np.random.seed(SEED) set_random_seed(SEED) rn.seed(SEED)

Obtengo resultados diferentes (precisión de la prueba) cada vez que ejecuto el ejemplo imdb_lstm.py del marco de Keras ( https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py ) El código contiene np.random.seed(1337) en la parte superior, antes de cualquier importación de keras. Debe evitar que genere números diferentes para cada ejecución. ¿Qué me estoy perdiendo?

ACTUALIZACIÓN: Cómo reprobar:

  1. Instalar Keras ( http://keras.io/ )
  2. Ejecute https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py varias veces. Entrenará el modelo y la precisión de la prueba de salida.
    Resultado esperado: la precisión de la prueba es la misma en cada ejecución.
    Resultado real: la precisión de la prueba es diferente en cada ejecución.

ACTUALIZACIÓN2: lo estoy ejecutando en Windows 8.1 con MinGW / msys, versiones de módulo:
theano 0.7.0
numpy 1.8.1
scipy 0.14.0c1

ACTUALIZACIÓN3: reduje un poco el problema. Si ejecuto el ejemplo con GPU (configure theano flag device = gpu0), obtengo una precisión de prueba diferente cada vez, pero si lo ejecuto en la CPU, todo funciona como se esperaba. Mi tarjeta gráfica: NVIDIA GeForce GT 635)


Estoy de acuerdo con el comentario anterior, pero los resultados reproducibles a veces necesitan el mismo entorno (por ejemplo, paquetes instalados, características de la máquina, etc.). Por lo tanto, recomiendo copiar su entorno a otro lugar en caso de tener resultados reproducibles. Intente utilizar una de las siguientes tecnologías:

  1. Docker Si tienes un Linux, es muy fácil mover tu entorno a otro lugar. También puedes intentar usar DockerHub .
  2. Binder Esta es una plataforma en la nube para reproducir experimentos científicos.
  3. Everware Esta es otra plataforma en la nube para la "ciencia reutilizable". Vea el repositorio del proyecto en Github.

Finalmente obtuve resultados reproducibles con mi código. Es una combinación de respuestas que vi en la web. Lo primero es hacer lo que @alex dice:

  1. Establecer numpy.random.seed ;
  2. Use PYTHONHASHSEED=0 para Python 3.

Luego debe resolver el problema observado por @ user2805751 con respecto a cuDNN llamando a su código Keras con los siguientes THEANO_FLAGS adicionales:

  1. dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic

Y finalmente, debe parchear su instalación de Theano según este comentario , que básicamente consiste en:

  1. reemplazando todas las llamadas al operador *_dev20 por su versión regular en theano/sandbox/cuda/opt.py

Esto debería obtener los mismos resultados para la misma semilla.

Tenga en cuenta que puede haber una desaceleración. Vi un aumento en el tiempo de ejecución de aproximadamente el 10%.


He entrenado y probado el tipo de redes neuronales Sequential() utilizando Keras. Realicé una regresión no lineal en datos de voz ruidosa. Usé el siguiente código para generar semilla aleatoria:

import numpy as np seed = 7 np.random.seed(seed)

Obtengo exactamente los mismos resultados de val_loss cada vez que entreno y val_loss con los mismos datos.


La documentation de Theano habla sobre las dificultades de sembrar variables aleatorias y por qué siembran cada instancia de gráfico con su propio generador de números aleatorios.

Compartir un generador de números aleatorios entre diferentes {{{RandomOp}}} hace que sea difícil producir la misma secuencia independientemente de otras operaciones en el gráfico, y mantener aislado {{{RandomOps}}}. Por lo tanto, cada instancia de {{{RandomOp}}} en un gráfico tendrá su propio generador de números aleatorios. Ese generador de números aleatorios es una entrada a la función. En el uso típico, usaremos las nuevas características de las entradas de función ({{{value}}}, {{{update}}}) para pasar y actualizar el rng para cada {{{RandomOp}}}. Al pasar los RNG como entradas, es posible utilizar los métodos normales de acceso a las entradas de funciones para acceder a cada rng de {{{RandomOp}}}. En este enfoque, no existe un mecanismo preexistente para trabajar con el estado de números aleatorios combinados de un gráfico completo. Por lo tanto, la propuesta es proporcionar la funcionalidad que falta (los últimos tres requisitos) a través de funciones auxiliares: {{{seed, getstate, setstate}}}.

También proporcionan examples sobre cómo sembrar todos los generadores de números aleatorios.

También puede inicializar todas las variables aleatorias asignadas por un objeto RandomStreams mediante el método de inicialización de ese objeto. Esta semilla se usará para sembrar un generador temporal de números aleatorios, que a su vez generará semillas para cada una de las variables aleatorias.

>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each


Me gustaría agregar algo a las respuestas anteriores. Si usa Python 3 y desea obtener resultados reproducibles para cada ejecución, debe

  1. establece numpy.random.seed al comienzo de tu código
  2. dar PYTHONHASHSEED = 0 como parámetro para el intérprete de Python

Puede encontrar la respuesta en los documentos de Keras: https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development .

En resumen, para estar absolutamente seguro de que obtendrá resultados reproducibles con su script de Python en la CPU de una computadora / computadora portátil, entonces deberá hacer lo siguiente:

  1. Establezca la variable de entorno PYTHONHASHSEED en un valor fijo
  2. Establezca el generador pseudoaleatorio incorporado de python en un valor fijo
  3. Establezca el numpy pseudoaleatorio numpy en un valor fijo
  4. Establezca el tensorflow pseudoaleatorio de tensorflow en un valor fijo
  5. Configurar una nueva sesión global de tensorflow

Siguiendo el enlace de Keras en la parte superior, el código fuente que estoy usando es el siguiente:

# Seed value # Apparently you may use different seed values at each stage seed_value= 0 # 1. Set the `PYTHONHASHSEED` environment variable at a fixed value import os os.environ[''PYTHONHASHSEED'']=str(seed_value) # 2. Set the `python` built-in pseudo-random generator at a fixed value import random random.seed(seed_value) # 3. Set the `numpy` pseudo-random generator at a fixed value import numpy as np np.random.seed(seed_value) # 4. Set the `tensorflow` pseudo-random generator at a fixed value import tensorflow as tf tf.set_random_seed(seed_value) # 5. Configure a new global `tensorflow` session from keras import backend as K session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1) sess = tf.Session(graph=tf.get_default_graph(), config=session_conf) K.set_session(sess)

No es necesario decir que no tiene que especificar ninguna seed o random_state en las numpy , scikit-learn o tensorflow / keras que está utilizando en su script de python exactamente porque con el código fuente anterior configuramos globalmente su pseudo- generadores aleatorios a un valor fijo.