tf.random.Generator
Генератор псевдослучайных чисел.
tf.random.Generator(
copy_from=None, state=None, alg=None
)
Пример:
Создание генератора из семян:
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)>
Процессор, графический процессор и 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=...>
| Аргументы | |
|---|---|
copy_from | генератор, который нужно скопировать. |
state | вектор типа STATE_TYPE, представляющий начальное состояние RNG, длина и семантика которого зависят от алгоритма. Если это переменная, генератор будет её повторно использовать вместо создания новой переменной. |
alg | алгоритм RNG. Возможные значения — tf.random.Algorithm.PHILOX для алгоритма Philox и tf.random.Algorithm.THREEFRY для алгоритма ThreeFry (см. статью «Параллельные псевдослучайные числа: так просто, как 1, 2, 3» [https://www.thesalmons.org/john/random123/papers/random123sc11.pdf]). Также можно использовать строковые имена "philox" и "threefry". Примечание: PHILOX гарантирует, что на всех архитектурах (CPU, GPU, XLA и т. д.) будут получены одинаковые числа (при одинаковом состоянии генератора). |
| Атрибуты | |
|---|---|
algorithm | Идентификатор алгоритма RNG (целое число Python или скалярный целочисленный тензор). |
key | Часть «ключ» состояния генератора на основе счетчика. Для алгоритма RNG на основе счетчика, такого как Philox и ThreeFry (как описано в статье «Параллельные псевдослучайные числа: так просто, как 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__ для возможных значений. |
| Возвращает | |
|---|---|
| Новый генератор. |
Исключения:
-
ValueError: если генератор создаётся внутри синхронной стратегииtf.distribute, напримерMirroredStrategyилиTPUStrategy, потому что есть неоднозначность в том, как реплицировать генератор (например, нужно ли копировать его, чтобы каждая репликация получала одинаковые случайные числа, или нужно «разделить» его на разные генераторы, которые генерируют разные случайные числа).
from_non_deterministic_state
@classmethod
from_non_deterministic_state(
alg=None
)
Создаёт генератор, инициализируя его состояние недетерминированно.
Источник недетерминизма будет зависеть от платформы и времени.
| Аргументы | |
|---|---|
alg | (необязательно) алгоритм RNG. Если None, будет выбран автоматически. См. __init__ для возможных значений. |
| Возвращает | |
|---|---|
| Новый генератор. |
Исключения:
-
ValueError: если генератор создаётся внутри синхронной стратегииtf.distribute, напримерMirroredStrategyилиTPUStrategy, потому что есть неоднозначность в том, как реплицировать генератор (например, нужно ли копировать его, чтобы каждая репликация получала одинаковые случайные числа, или нужно «разделить» его на разные генераторы, которые генерируют разные случайные числа).
from_seed
@classmethod
from_seed(
seed, alg=None
)
Создаёт генератор из семян.
Семена — 1024-битовое целое без знака, представленное либо целым числом Python, либо вектором целых чисел. Семена, меньшие 1024 бит, будут дополнены. Дополнение, внутренняя структура семян и способ преобразования семян в состояние — всё не определено (неописано). Единственное семантическое требование к семенам — два разных семени, скорее всего, приведут к двум независимым генераторам (но это не гарантируется).
| Аргументы | |
|---|---|
seed | семена для RNG. |
alg | (необязательно) алгоритм RNG. Если None, будет выбран автоматически. См. __init__ для возможных значений. |
| Возвращает | |
|---|---|
| Новый генератор. |
Исключения:
-
ValueError: если генератор создаётся внутри синхронной стратегииtf.distribute, напримерMirroredStrategyилиTPUStrategy, потому что есть неоднозначность в том, как реплицировать генератор (например, нужно ли копировать его, чтобы каждая репликация получала одинаковые случайные числа, или нужно «разделить» его на разные генераторы, которые генерируют разные случайные числа).
from_state
@classmethod
from_state(
state, alg
)
Создаёт генератор из состояния.
См. __init__ для описания state и alg.
| Аргументы | |
|---|---|
state | новое состояние. |
alg | алгоритм RNG. |
| Возвращает | |
|---|---|
| Новый генератор. |
Исключения:
-
ValueError: если генератор создан внутри синхроннойtf.distributeстратегии, напримерMirroredStrategyилиTPUStrategy, потому что возникает неоднозначность в том, как дублировать генератор (например, следует ли копировать его так, чтобы каждая репликация получала те же случайные числа, или следует ли «разделить» его на разные генераторы, которые генерируют разные случайные числа).
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 | Целочисленный тензор 1-й размерности или массив Python. Форма тензора вывода. |
mean | 0-мерный тензор или Python-значение типа dtype. Среднее значение нормального распределения. |
stddev | 0-мерный тензор или 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
)
Передвинуть счетчик генератора, основанного на счетчике.
| Аргументы | |
|---|---|
delta | величина перемещения. Состояние генератора после skip(n) будет таким же, как после normal([n]) (или любого другого распределения). Фактическое приращение, добавленное к счетчику, является неопределенным деталью реализации. |
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 , независимых друг от друга. Новые генераторы используют тот же алгоритм генерации псевдослучайных чисел, что и старый. |
truncated_normal
truncated_normal(
shape, mean=0.0, stddev=1.0, dtype=tf.dtypes.float32, name=None
)
Выводит случайные значения из усечённого нормального распределения.
Сгенерированные значения следуют нормальному распределению со средним значением и стандартным отклонением, за исключением того, что значения, абсолютная величина которых больше, чем 2 стандартных отклонения от среднего, отбрасываются и перебираются заново.
| Аргументы | |
|---|---|
shape | Целочисленный тензор 1-й размерности или массив Python. Форма тензора вывода. |
mean | 0-мерный тензор или Python-значение типа dtype. Среднее значение усечённого нормального распределения. |
stddev | 0-мерный тензор или 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 | Целочисленный тензор 1-й размерности или массив Python. Форма тензора вывода. |
minval | Тензор или Python-значение типа dtype, совместимый по широковещанию с shape (для целочисленных типов широковещательная передача не поддерживается, поэтому она должна быть скаляром). Нижняя граница (включительно) диапазона случайных значений для генерации. Передайте None для целых чисел с полным диапазоном. По умолчанию 0. |
maxval | Тензор или Python-значение типа dtype, совместимый по широковещанию с shape (для целочисленных типов широковещательная передача не поддерживается, поэтому она должна быть скаляром). Верхняя граница (исключительно) диапазона случайных значений для генерации. Передайте None для целых чисел с полным диапазоном. По умолчанию 1, если dtype — тип с плавающей точкой. |
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 | (необязательно) имя узла. |
| Возвращаемое значение | |
|---|---|
| Массив случайных чисел требуемой формы. |
© 2020 The TensorFlow Authors. All rights reserved.
Licensed under the Creative Commons Attribution License 3.0.
Code samples licensed under the Apache 2.0 License.
https://www.tensorflow.org/versions/r2.3/api_docs/python/tf/random/Generator