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'

При втором вызове 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

Spec-Zone.ru

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