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:
- Instalar Keras ( http://keras.io/ )
-
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:
- Docker Si tienes un Linux, es muy fácil mover tu entorno a otro lugar. También puedes intentar usar DockerHub .
- Binder Esta es una plataforma en la nube para reproducir experimentos científicos.
- 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:
-
Establecer
numpy.random.seed
; -
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:
-
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:
-
reemplazando todas las llamadas al operador
*_dev20
por su versión regular entheano/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
- establece numpy.random.seed al comienzo de tu código
- 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:
-
Establezca la variable de entorno
PYTHONHASHSEED
en un valor fijo -
Establezca el generador pseudoaleatorio incorporado de
python
en un valor fijo -
Establezca el
numpy
pseudoaleatorionumpy
en un valor fijo -
Establezca el
tensorflow
pseudoaleatorio detensorflow
en un valor fijo -
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.