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'
При втором вызове tf.random.uniform выше мы получаем «A2», а не «A1», потому что во втором вызове используется другое начальное значение операции.
Обратите внимание, что в данном случае 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'
При втором вызове tf.random.uniform выше мы получаем «A2», а не «A1», потому что TensorFlow использует одно и то же ядро tf.random.uniform (то есть внутреннее представление) для всех вызовов с одинаковыми аргументами. Ядро поддерживает внутренний счетчик, который увеличивается при каждом выполнении и генерирует разные результаты.
Вызов 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