Spec-Zone.ru › TensorFlow

tf.random.set_seed

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

tf.random.set_seed(
    seed
)

Используется в ноутбуках

Используется в руководстве Используется в учебниках
  • Распределенное обучение с помощью Core API и DTensor
  • Логистическая регрессия для бинарной классификации с помощью Core API
  • Многослойные перцептроны для распознавания цифр с помощью Core API
  • Оптимизаторы с помощью Core API
  • Быстрый старт для TensorFlow Core API
  • Генерация музыки с помощью RNN
  • Простое распознавание аудио: распознавание ключевых слов
  • Игра в CartPole с помощью метода Actor-Critic
  • Пример TensorFlow Probability: Оценка ковариации
  • Заметки к выпуску TFP (ноутбук 0.11.0)

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

Взаимодействие с семенами уровня операции:

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

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

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

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

Spec-Zone.ru

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