tf.random.set_seed
Устанавливает глобальное семя для генерации случайных чисел.
tf.random.set_seed(
seed
)
Используется в ноутбуках
| Используется в руководстве | Используется в учебниках |
|---|---|
Операции, которые зависят от семени случайных чисел, фактически получают его из двух семян: глобального и уровня операции. Эта функция устанавливает глобальное семя.
Взаимодействие с семенами уровня операции:
- Если ни глобальное, ни операционное семя не установлены: для этой операции используется случайно выбранное семя.
- Если глобальное семя установлено, но семя операции нет: система детерминированно выбирает семя операции в сочетании с глобальным, чтобы получить уникальную последовательность случайных чисел. В рамках одной версии TensorFlow и кода пользователя эта последовательность является детерминированной. Однако в разных версиях она может меняться. Если код зависит от конкретных семян для работы, явно укажите глобальное и операционное семена.
- Если операционное семя установлено, но глобальное нет: используется по умолчанию глобальное семя и указанное операционное семя для определения последовательности случайных чисел.
- Если и глобальное, и операционное семена установлены: оба семени используются совместно для определения последовательности случайных чисел.
Для иллюстрации пользовательских эффектов рассмотрим эти примеры:
Если ни глобальное, ни операционное семя не установлены, мы получаем разные результаты для каждого вызова операции случайных чисел и каждого повторного запуска программы:
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'
Если глобальное семя установлено, но семя операции нет, мы получаем разные результаты для каждого вызова операции случайных чисел, но одну и ту же последовательность для каждого повторного запуска программы:
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)'
Если операционное семя установлено, мы получаем разные результаты для каждого вызова операции случайных чисел, но одну и ту же последовательность для каждого повторного запуска программы:
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'
Когда несколько идентичных операций случайных чисел заключены в 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)» каждый раз, используйте бессостоятельные операции случайных чисел, такие как tf.random.stateless_uniform. Также см. tf.random.experimental.Generator для нового набора состоятельных операций случайных чисел, которые используют внешние переменные для управления их состоянием.
| Аргументы | |
|---|---|
seed | целое число. |
© 2022 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 4.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/api_docs/python/tf/random/set_seed