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)>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