tf.random.Generator
Генератор случайных чисел.
tf.random.Generator(
copy_from=None, state=None, alg=None
)
Пример:
Создание генератора из seed:
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 с одинаковым алгоритмом и seed будут генерировать одинаковые целочисленные случайные числа. Результаты с плавающей точкой (например, вывод 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
)
Создаёт генератор из seed.
Seed — это 1024-битовое целое без знака, представленное либо целым числом Python, либо вектором целых чисел. Seed'ы короче 1024 бит будут дополнены. Дополнение, внутренняя структура seed'a и способ преобразования seed'a в состояние являются неспецифицированными (непрозрачными). Единственное семантическое указание для seed'ов заключается в том, что два разных seed'a, скорее всего, приведут к двум независимым генераторам (но без гарантии).
| Аргументы | |
|---|---|
seed | 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 | Целочисленный тензор или массив Python 1-й размерности. Форма выходного тензора. |
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 | Целочисленный тензор или массив Python 1-й размерности. Форма выходного тензора. |
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 | Целочисленный тензор или массив Python 1-й размерности. Форма выходного тензора. |
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.4/api_docs/python/tf/random/Generator