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

Процессор, графический процессор и 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

Spec-Zone.ru

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