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=...>
При создании генератора внутри области 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, а другая — два вызова 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 (см. статью «Параллельные случайные числа: так же просто, как 1, 2, 3» [https://www.thesalmons.org/john/random123/papers/random123sc11.pdf]). Также можно использовать строковые имена "philox" и "threefry". Обратите внимание, что PHILOX гарантирует, что на всех архитектурах (CPU, GPU, XLA и т. д.) будут получаться одни и те же числа (при одинаковом состоянии генератора). |
| Атрибуты | |
|---|---|
algorithm | Идентификатор алгоритма RNG (целое число Python или скалярный тензор целого типа). |
key | Часть «ключ» состояния генератора на основе счётчика. Для алгоритма на основе счётчика, такого как 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 | 1-мерный целочисленный тензор или массив 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
)
Создаёт генератор из состояния.
См. __init__ для описания state и alg.
| Аргументы | |
|---|---|
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 | 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 | величина приращения. Состояние RNG после skip(n) будет таким же, как после normal([n]) (или любого другого распределения). Фактическое приращение счётчика является не определённой реализацией. |
| Возвращаемое значение | |
|---|---|
Тензор типа int64. |
split
split(
count=1
)
Возвращает список независимых объектов генераторов случайных чисел.
Два генератора независимы друг от друга в том смысле, что потоки случайных чисел, которые они генерируют, не имеют статистически обнаруживаемых корреляций. Новые генераторы также независимы от старого. Состояние старого генератора будет изменено (как и в других методах генерации случайных чисел), поэтому два вызова 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) объектов генераторов случайных чисел, независимых друг от друга. Новые генераторы имеют тот же алгоритм RNG, что и старый. |
truncated_normal
truncated_normal(
shape,
mean=0.0,
stddev=1.0,
dtype=tf.dtypes.float32,
name=None
)
Выводит случайные значения из усечённого нормального распределения.
Сгенерированные значения следуют нормальному распределению со заданным средним значением и стандартным отклонением, за исключением того, что значения, абсолютная величина которых больше, чем 2 стандартных отклонения от среднего значения, отбрасываются и выбираются заново.
END_OF_DOCUMENT_MARKER| Аргументы | |
|---|---|
shape | Массив целых чисел тензор 1-D или Python. Форма выходного тензора. |
mean | Тензор 0-D или Python значение типа dtype. Среднее значение усечённого нормального распределения. |
stddev | Тензор 0-D или 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-D или 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 | (необязательно) имя узла. |
| Возвращает | |
|---|---|
| Тензор случайных чисел требуемой формы. |
© 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