Spec-Zone.ru › TensorFlow 2.3

tf.random.set_seed

Устанавливает глобальное семя для генерации случайных чисел.

tf.random.set_seed(
    seed
)

Операции, которые зависят от случайного семени, фактически получают его из двух семян: глобального и семени на уровне операции. Это устанавливает глобальное семя.

Взаимодействие с семенами на уровне операций выглядит следующим образом:

  1. Если ни глобальное семя, ни семя операции не установлены: для этой операции используется случайно выбранное семя.
  2. Если семя на уровне графа установлено, но семя операции нет: система детерминированно выбирает семя операции в сочетании с семеном на уровне графа, чтобы получить уникальную последовательность случайных чисел. В рамках одной версии TensorFlow и пользовательского кода эта последовательность является детерминированной. Однако в разных версиях эта последовательность может изменяться. Если код зависит от конкретных семян для работы, явно укажите семена на уровне графа и на уровне операции.
  3. Если семя операции установлено, но глобальное семя не установлено: используется по умолчанию глобальное семя и указанное семя операции для определения последовательности случайных чисел.
  4. Если установлены как глобальное, так и семя операции: оба семени используются совместно для определения последовательности случайных чисел.

Для иллюстрации эффектов, видимых пользователю, рассмотрим эти примеры:

Если ни глобальное семя, ни семя операции не установлены, мы получаем разные результаты для каждого вызова операции random и каждой повторной загрузки программы:

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

(теперь закройте программу и запустите её снова)

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

Если глобальное семя установлено, но семя операции не установлено, мы получаем разные результаты для каждого вызова операции random, но одну и ту же последовательность для каждой повторной загрузки программы:

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

(теперь закройте программу и запустите её снова)

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

Причина, по которой мы получаем 'A2' вместо 'A1' при втором вызове tf.random.uniform выше, заключается в том, что второй вызов использует другое семя операции.

Обратите внимание, что tf.function действует как повторная загрузка программы в этом случае. Когда глобальное семя установлено, но семена операций не установлены, последовательность случайных чисел одинакова для каждого вызова tf.function. Например:

tf.random.set_seed(1234)

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

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

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

Если семя операции установлено, мы получаем разные результаты для каждого вызова операции random, но одну и ту же последовательность для каждой повторной загрузки программы:

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

(теперь закройте программу и запустите её снова)

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

Причина, по которой мы получаем 'A2' вместо 'A1' при втором вызове tf.random.uniform выше, заключается в том, что один и тот же tf.random.uniform ядро (т.е. внутреннее представление) используется TensorFlow для всех вызовов с одинаковыми аргументами, и ядро поддерживает внутренний счётчик, который увеличивается каждый раз при выполнении, генерируя разные результаты.

Вызов tf.random.set_seed сбросит все такие счётчики:

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'

Когда несколько идентичных операций random заключены в tf.function, их поведение изменяется, потому что операции больше не используют один и тот же счётчик. Например:

@tf.function
def foo():
  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.function
def bar():
  a = tf.random.uniform([1])
  b = tf.random.uniform([1])
  return a, b
print(bar())  # prints '(A1, A2)'
print(bar())  # prints '(A3, A4)'

Второй вызов foo возвращает '(A2, A2)' вместо '(A1, A1)', потому что tf.random.uniform поддерживает внутренний счётчик. Если вы хотите, чтобы foo возвращало '(A1, A1)' каждый раз, используйте бессостоятельные операции random, такие как tf.random.stateless_uniform. Также см. tf.random.experimental.Generator для нового набора состоятельных операций random, которые используют внешние переменные для управления своим состоянием.

Аргументы
seed целое число.

© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/random/set_seed

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API