Spec-Zone.ru › TensorFlow

tf.random.Generator

Генератор случайных чисел.

Просмотреть псевдонимы

Основные псевдонимы

tf.random.experimental.Generator

Псевдонимы для совместимости при миграции

Подробнее см. в руководстве по миграции.

tf.compat.v1.random.Generator, tf.compat.v1.random.experimental.Generator

tf.random.Generator(
    copy_from=None, state=None, alg=None
)

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

Используется в руководстве Используется в учебных материалах
  • Генерация случайных чисел
  • Аугментация данных
  • Генерация случайного шума в TFF

Пример:

Создание генератора из начального значения:

g = tf.random.Generator.from_seed(1234)
g.normal(shape=(2, 3))
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[ 0.9356609 ,  1.0854305 , -0.93788373],
       [-0.5061547 ,  1.3169702 ,  0.7137579 ]], dtype=float32)>

Создание генератора из недетерминированного состояния:

g = tf.random.Generator.from_non_deterministic_state()
g.normal(shape=(2, 3))
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=...>

Все конструкторы позволяют явно выбрать алгоритм генерации случайных чисел (RNG). Поддерживаются алгоритмы "philox" и "threefry". Например:

g = tf.random.Generator.from_seed(123, alg="philox")
g.normal(shape=(2, 3))
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=
array([[ 0.8673864 , -0.29899067, -0.9310337 ],
       [-1.5828488 ,  1.2481191 , -0.6770643 ]], dtype=float32)>

CPU, GPU и TPU с одинаковым алгоритмом и начальным значением будут генерировать одинаковые случайные целые числа. Результаты с плавающей запятой (например, выходные данные normal) могут незначительно отличаться на разных устройствах из-за численных погрешностей.

Этот класс использует tf.Variable для управления внутренним состоянием. При каждой генерации случайных чисел состояние генератора меняется. Например:

g = tf.random.Generator.from_seed(1234)
g.state
<tf.Variable ... numpy=array([1234,    0,    0])>
g.normal(shape=(2, 3))
<...>
g.state
<tf.Variable ... numpy=array([2770,    0,    0])>

Форма состояния зависит от алгоритма.

Также существует глобальный генератор:

g = tf.random.get_global_generator()
g.normal(shape=(2, 3))
<tf.Tensor: shape=(2, 3), dtype=float32, numpy=...>

При создании генератора в области действия tf.distribute.Strategy каждая реплика получает отдельный поток случайных чисел.

Например, в следующем коде:

strat = tf.distribute.MirroredStrategy(devices=["cpu:0", "cpu:1"])
with strat.scope():
  g = tf.random.Generator.from_seed(1)
  def f():
    return g.normal([])
  results = strat.run(f).values

results[0] и results[1] будут иметь разные значения.

Если генератор инициализирован начальным значением (например, создан с помощью Generator.from_seed), случайные числа будут определяться этим значением, хотя разные реплики и получат разные числа. Можно считать, что случайное число, сгенерированное на реплике, является хешем идентификатора реплики и общего для реплик «главного» случайного числа. Поэтому вся система остается детерминированной.

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

Генераторы можно свободно сохранять и восстанавливать с помощью tf.train.Checkpoint. Контрольную точку можно восстановить в стратегии распределения с числом реплик, отличным от исходного. Если идентификатор реплики присутствует как в исходной, так и в новой стратегии распределения, ее состояние будет восстановлено корректно (то есть поток случайных чисел после восстановления будет таким же, как в момент сохранения), если до сохранения трассы вызовов RNG реплик не разошлись (например, одна реплика выполнила один вызов RNG, а другая — два). Такая гарантия не предоставляется, если генератор сохранен в области действия стратегии, а восстановлен вне какой-либо области действия стратегии, или наоборот.

Если генератор создан в области действия tf.distribute.experimental.ParameterServerStrategy, рабочие узлы будут совместно использовать состояние генератора (размещенное на одном из серверов параметров). При этом, как сказано выше, рабочие узлы все равно будут получать разные потоки случайных чисел. (Это похоже на последовательный доступ реплик в tf.distribute.MirroredStrategy к генератору, созданному вне стратегии.) Каждый вызов RNG на рабочем узле приводит к обмену данными с сервером параметров и обратно, что может повлиять на производительность. При создании tf.distribute.experimental.ParameterServerStrategy убедитесь, что аргумент variable_partitioner не будет разделять на части небольшие переменные формы [2] или [3] (состояния генераторов нельзя разделять на части). Чтобы избежать разделения небольших переменных, можно задать для variable_partitioner значение None или использовать tf.distribute.experimental.partitioners.MinSizePartitioner с достаточно большим значением min_shard_bytes (подробнее см. в документации tf.distribute.experimental.ParameterServerStrategy).

Аргументы
copy_from генератор, с которого нужно скопировать данные.
state вектор типа STATE_TYPE, представляющий начальное состояние RNG; его длина и семантика зависят от алгоритма. Если это переменная, генератор будет повторно использовать ее, а не создавать новую.
alg алгоритм RNG. Возможные значения: tf.random.Algorithm.PHILOX для алгоритма Philox и tf.random.Algorithm.THREEFRY для алгоритма ThreeFry (см. статью «Parallel Random Numbers: As Easy as 1, 2, 3» [https://www.thesalmons.org/john/random123/papers/random123sc11.pdf]). Также можно использовать строковые имена "philox" и "threefry". Обратите внимание: PHILOX гарантирует получение одинаковых чисел (при одинаковом состоянии генератора случайных чисел) на всех архитектурах (CPU, GPU, XLA и т. д.).
Атрибуты
algorithm Идентификатор алгоритма RNG (целое число Python или скалярный тензор целочисленного типа).
key Часть состояния RNG на основе счетчика, называемая «ключом».

Для алгоритма RNG на основе счетчика, например Philox и ThreeFry (описанных в статье «Parallel Random Numbers: As Easy as 1, 2, 3» [https://www.thesalmons.org/john/random123/papers/random123sc11.pdf]), состояние RNG состоит из двух частей: счетчика и ключа. Выходные данные генерируются по формуле: output=hash(key, counter), то есть вычисляется хеш счетчика с параметрами, заданными ключом. Два генератора RNG с разными ключами можно считать генераторами двух независимых потоков случайных чисел (поток формируется увеличением счетчика).

state Внутреннее состояние RNG.

Методы

binomial

Посмотреть исходный код

binomial(
    shape,
    counts,
    probs,
    dtype=tf.dtypes.int32,
    name=None
)

Возвращает случайные значения из биномиального распределения.

Сгенерированные значения соответствуют биномиальному распределению с заданными параметрами: числом испытаний и вероятностью успеха.

Пример:

counts = [10., 20.]
# Probability of success.
probs = [0.8]

rng = tf.random.Generator.from_seed(seed=234)
binomial_samples = rng.binomial(shape=[2], counts=counts, probs=probs)


counts = ... # Shape [3, 1, 2]
probs = ...  # Shape [1, 4, 2]
shape = [3, 4, 3, 4, 2]
rng = tf.random.Generator.from_seed(seed=1717)
# Sample shape will be [3, 4, 3, 4, 2]
binomial_samples = rng.binomial(shape=shape, counts=counts, probs=probs)
Аргументы
shape Одномерный целочисленный тензор или массив Python. Форма выходного тензора.
counts Тензор. Количество испытаний биномиального распределения. Должно допускать трансляцию с probs, а также с правыми измерениями shape.
probs Тензор. Вероятность успеха для биномиального распределения. Должна допускать трансляцию с counts, а также с правыми измерениями shape.
dtype Тип выходных данных. По умолчанию: tf.int32
name Имя операции (необязательно).
Возвращает
samples Тензор заданной формы, заполненный случайными биномиальными значениями. Для каждого i каждое значение samples[i, ...] является независимой выборкой из биномиального распределения с counts[i] испытаниями и вероятностью успеха probs[i].

from_key_counter

Посмотреть исходный код

@classmethod
from_key_counter(
    key, counter, alg
)

Создает генератор на основе ключа и счетчика.

Этот конструктор применим только к алгоритмам на основе счетчика. Значение понятий «ключ» и «счетчик» описано в методе key.

Аргументы
key ключ RNG — скаляр типа STATE_TYPE.
counter вектор типа STATE_TYPE, представляющий начальный счетчик RNG; его длина зависит от алгоритма.
alg алгоритм RNG. Если значение равно None, алгоритм выбирается автоматически. Возможные значения см. в __init__.
Возвращает
Новый генератор.

from_non_deterministic_state

Посмотреть исходный код

@classmethod
from_non_deterministic_state(
    alg=None
)

Создает генератор, недетерминированно инициализируя его состояние.

Источник недетерминированности зависит от платформы и времени.

Аргументы
alg (необязательно) алгоритм RNG. Если значение равно None, алгоритм выбирается автоматически. Возможные значения см. в __init__.
Возвращает
Новый генератор.

from_seed

Посмотреть исходный код

@classmethod
from_seed(
    seed, alg=None
)

Создает генератор из начального значения.

Начальное значение — это 1024-битное беззнаковое целое число, представленное в виде целого числа Python или вектора целых чисел. Значения короче 1024 бит дополняются. Способ дополнения, внутренняя структура начального значения и способ его преобразования в состояние не определены. Единственная гарантия относительно начальных значений состоит в том, что два разных значения, скорее всего, создадут два независимых генератора (но это не гарантируется).

Аргументы
seed начальное значение RNG.
alg (необязательно) алгоритм RNG. Если значение равно None, алгоритм выбирается автоматически. Возможные значения см. в __init__.
Возвращает
Новый генератор.

from_state

Посмотреть исходный код

@classmethod
from_state(
    state, alg
)

Создает генератор из состояния.

Описание state и alg см. в __init__.

Аргументы
state новое состояние.
alg алгоритм RNG.
Возвращает
Новый генератор.

make_seeds

Посмотреть исходный код

make_seeds(
    count=1
)

Генерирует начальные значения для операций генерации случайных чисел без состояния.

Например:

seeds = get_global_generator().make_seeds(count=10)
for i in range(10):
  seed = seeds[:, i]
  numbers = stateless_random_normal(shape=[2, 3], seed=seed)
  ...
Аргументы
count количество пар начальных значений (для вызова операций генерации случайных чисел без состояния требуется пара начальных значений).
Возвращает
Тензор формы [2, count] и типа int64.

normal

Посмотреть исходный код

normal(
    shape,
    mean=0.0,
    stddev=1.0,
    dtype=tf.dtypes.float32,
    name=None
)

Возвращает случайные значения из нормального распределения.

Аргументы
shape Одномерный целочисленный тензор или массив Python. Форма выходного тензора.
mean Тензор нулевой размерности или значение Python типа dtype. Среднее нормального распределения.
stddev Тензор нулевой размерности или значение Python типа dtype. Стандартное отклонение нормального распределения.
dtype Тип выходных данных.
name Имя операции (необязательно).
Возвращает
Тензор заданной формы, заполненный случайными значениями из нормального распределения.

reset

Посмотреть исходный код

reset(
    state
)

Сбрасывает генератор, задавая новое состояние.

Значение понятия «состояние» см. в __init__.

Аргументы
state новое состояние.

reset_from_key_counter

Посмотреть исходный код

reset_from_key_counter(
    key, counter
)

Сбрасывает генератор, задавая новую пару ключа и счетчика.

Значение понятий «ключ» и «счетчик» см. в from_key_counter.

Аргументы
key новый ключ.
counter новый счетчик.

reset_from_seed

Посмотреть исходный код

reset_from_seed(
    seed
)

Сбрасывает генератор, задавая новое начальное значение.

Значение понятия «начальное значение» см. в from_seed.

Аргументы
seed новое начальное значение.

skip

Посмотреть исходный код

skip(
    delta
)

Продвигает счетчик RNG на основе счетчика.

Аргументы
delta величина продвижения. Состояние RNG после skip(n) будет таким же, как после normal([n]) (или любого другого распределения). Фактическое приращение счетчика является неуказанной деталью реализации.
Возвращает
Tensor типа int64.

split

Посмотреть исходный код

split(
    count=1
)

Возвращает список независимых объектов Generator.

Два генератора независимы друг от друга в том смысле, что в генерируемых ими потоках случайных чисел нет статистически обнаружимых корреляций. Новые генераторы также независимы от исходного. Состояние исходного генератора изменится (как и при использовании других методов генерации случайных чисел), поэтому два вызова split вернут разные новые генераторы.

Например:

gens = get_global_generator().split(count=10)
for gen in gens:
  numbers = gen.normal(shape=[2, 3])
  # ...
gens2 = get_global_generator().split(count=10)
# gens2 will be different from gens

Новые генераторы будут размещены на текущем устройстве (которое может отличаться от устройства исходного генератора). Например:

with tf.device("/device:CPU:0"):
  gen = Generator(seed=1234)  # gen is on CPU
with tf.device("/device:GPU:0"):
  gens = gen.split(count=10)  # gens are on GPU
Аргументы
count количество генераторов, которые нужно вернуть.
Возвращает
Список (длина count) объектов Generator, независимых друг от друга. Новые генераторы используют тот же алгоритм RNG, что и исходный.

truncated_normal

Посмотреть исходный код

truncated_normal(
    shape,
    mean=0.0,
    stddev=1.0,
    dtype=tf.dtypes.float32,
    name=None
)

Возвращает случайные значения из усеченного нормального распределения.

Сгенерированные значения соответствуют нормальному распределению с заданными средним и стандартным отклонением, однако значения, отстоящие от среднего более чем на два стандартных отклонения, отбрасываются и выбираются повторно.

Аргументы
shape Одномерный целочисленный тензор или массив Python. Форма выходного тензора.
mean Тензор нулевой размерности или значение Python типа dtype. Среднее усеченного нормального распределения.
stddev Тензор нулевой размерности или значение Python типа dtype. Стандартное отклонение нормального распределения до усечения.
dtype Тип выходных данных.
name Имя операции (необязательно).
Возвращает
Тензор заданной формы, заполненный случайными значениями из усеченного нормального распределения.

uniform

Посмотреть исходный код

uniform(
    shape,
    minval=0,
    maxval=None,
    dtype=tf.dtypes.float32,
    name=None
)

Возвращает случайные значения из равномерного распределения.

Сгенерированные значения соответствуют равномерному распределению в диапазоне [minval, maxval). Нижняя граница minval включена в диапазон, а верхняя граница maxval исключена. (Для чисел с плавающей запятой, особенно низкой точности, например bfloat16, из-за округления результат иногда может включать maxval.)

Для чисел с плавающей запятой диапазон по умолчанию — [0, 1). Для целых чисел необходимо явно указать как минимум maxval.

В случае целых чисел результат немного смещен, если только maxval - minval не является точной степенью двойки. Смещение мало для значений maxval - minval, значительно меньших диапазона выходных данных (2**32 или 2**64).

Чтобы получить случайные целые числа из полного диапазона, передайте minval=None и maxval=None с целочисленным значением dtype (для целочисленных типов данных minval и maxval должны быть либо оба равны None, либо оба не равны None).

Аргументы
shape Одномерный целочисленный тензор или массив Python. Форма выходного тензора.
minval Тензор или значение Python типа dtype, допускающее трансляцию с shape (для целочисленных типов трансляция не поддерживается, поэтому значение должно быть скалярным). Нижняя граница диапазона генерируемых случайных значений (включительно). Для целых чисел из полного диапазона передайте None. По умолчанию равно 0.
maxval Тензор или значение Python типа dtype, допускающее трансляцию с shape (для целочисленных типов трансляция не поддерживается, поэтому значение должно быть скалярным). Верхняя граница диапазона генерируемых случайных значений (не включительно). Для целых чисел из полного диапазона передайте None. Если dtype имеет тип с плавающей запятой, по умолчанию равно 1.
dtype Тип выходных данных.
name Имя операции (необязательно).
Возвращает
Тензор заданной формы, заполненный случайными значениями из равномерного распределения.
Вызывает исключение
ValueError Если dtype имеет целочисленный тип, а maxval не указано.

uniform_full_int

Посмотреть исходный код

uniform_full_int(
    shape,
    dtype=tf.dtypes.uint64,
    name=None
)

Равномерное распределение по всему диапазону целочисленного типа.

Этот метод эквивалентен заданию minval и maxval равными None в методе uniform.

Аргументы
shape форма выходных данных.
dtype (необязательно) целочисленный тип; по умолчанию uint64.
name (необязательно) имя узла.
Возвращает
Тензор случайных чисел требуемой формы.

© 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/Generator

Spec-Zone.ru

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