Establece la semilla aleatoria global.

tf.random.set_seed(
    seed
)

Las operaciones que dependen de una semilla aleatoria en realidad la derivan de dos semillas: las semillas globales y a nivel de operación. Esto establece la semilla global.

Sus interacciones con las semillas a nivel de operación son las siguientes:

  1. Si no se establece ni la semilla global ni la semilla de operación: para esta operación se utiliza una semilla seleccionada al azar.
  2. Si se establece la semilla de nivel de gráfico, pero la semilla de operación no lo es: El sistema selecciona de forma determinista una semilla de operación junto con la semilla de nivel de gráfico para obtener una secuencia aleatoria única. Dentro de la misma versión de tensorflow y código de usuario, esta secuencia es determinista. Sin embargo, en diferentes versiones, esta secuencia puede cambiar. Si el código depende de semillas particulares para funcionar, especifique las semillas de nivel de gráfico y de nivel de operación explícitamente.
  3. Si se establece la semilla de operación, pero no se establece la semilla global: Una semilla global predeterminada y la semilla de operación especificada se utilizan para determinar la secuencia aleatoria.
  4. Si se establecen tanto la semilla global como la de operación: Ambas semillas se utilizan en conjunto para determinar la secuencia aleatoria.

Para ilustrar los efectos visibles para el usuario, considere estos ejemplos:

Si no se establece ni la semilla global ni la semilla de operación, obtenemos resultados diferentes para cada llamada a la operación aleatoria y cada repetición del programa:

print(tf.random.uniform([1]))# generates 'A1'print(tf.random.uniform([1]))# generates 'A2'

(ahora cierra el programa y ejecútalo de nuevo)

print(tf.random.uniform([1]))# generates 'A3'print(tf.random.uniform([1]))# generates 'A4'

Si se establece la semilla global pero no se establece la semilla de la operación, obtenemos resultados diferentes para cada llamada a la operación aleatoria, pero la misma secuencia para cada repetición del programa:

tf.random.set_seed(1234)print(tf.random.uniform([1]))# generates 'A1'print(tf.random.uniform([1]))# generates 'A2'

(ahora cierra el programa y ejecútalo de nuevo)

tf.random.set_seed(1234)print(tf.random.uniform([1]))# generates 'A1'print(tf.random.uniform([1]))# generates 'A2'

La razón por la que obtenemos ‘A2’ en lugar de ‘A1’ en la segunda llamada de tf.random.uniform lo anterior se debe a que la segunda llamada usa una semilla de operación diferente.

Tenga en cuenta que tf.function actúa como una repetición de un programa en este caso. Cuando se establece la semilla global pero no se establecen las semillas de operación, la secuencia de números aleatorios es la misma para cada tf.function. Por ejemplo:

tf.random.set_seed(1234)@tf.functiondeff():
  a = tf.random.uniform([1])
  b = tf.random.uniform([1])return a, b

@tf.functiondefg():
  a = tf.random.uniform([1])
  b = tf.random.uniform([1])return a, b

print(f())# prints '(A1, A2)'print(g())# prints '(A1, A2)'

Si se establece la semilla de la operación, obtenemos resultados diferentes para cada llamada a la operación aleatoria, pero la misma secuencia para cada repetición del programa:

print(tf.random.uniform([1], seed=1))# generates 'A1'print(tf.random.uniform([1], seed=1))# generates 'A2'

(ahora cierra el programa y ejecútalo de nuevo)

print(tf.random.uniform([1], seed=1))# generates 'A1'print(tf.random.uniform([1], seed=1))# generates 'A2'

La razón por la que obtenemos ‘A2’ en lugar de ‘A1’ en la segunda llamada de tf.random.uniform arriba es porque lo mismo tf.random.uniform TensorFlow usa el kernel (es decir, la representación interna) para todas las llamadas con los mismos argumentos, y el kernel mantiene un contador interno que se incrementa cada vez que se ejecuta, generando resultados diferentes.

Vocación tf.random.set_seed restablecerá dichos contadores:

tf.random.set_seed(1234)print(tf.random.uniform([1], seed=1))# generates 'A1'print(tf.random.uniform([1], seed=1))# generates 'A2'
tf.random.set_seed(1234)print(tf.random.uniform([1], seed=1))# generates 'A1'print(tf.random.uniform([1], seed=1))# generates 'A2'

Cuando varias operaciones aleatorias idénticas se envuelven en un tf.function, sus comportamientos cambian porque las operaciones ya no comparten el mismo contador. Por ejemplo:

@tf.functiondeffoo():
  a = tf.random.uniform([1], seed=1)
  b = tf.random.uniform([1], seed=1)return a, b
print(foo())# prints '(A1, A1)'print(foo())# prints '(A2, A2)'@tf.functiondefbar():
  a = tf.random.uniform([1])
  b = tf.random.uniform([1])return a, b
print(bar())# prints '(A1, A2)'print(bar())# prints '(A3, A4)'

La segunda llamada de foo devuelve ‘(A2, A2)’ en lugar de ‘(A1, A1)’ porque tf.random.uniform mantiene un contador interno. Si quieres foo para devolver ‘(A1, A1)’ cada vez, use las operaciones aleatorias sin estado como tf.random.stateless_uniform. Ver también tf.random.experimental.Generator para un nuevo conjunto de operaciones aleatorias con estado que utilizan variables externas para gestionar sus estados.

Args
seed entero.