Spec-Zone.ru › TensorFlow

tf.random.experimental.index_shuffle

Возвращает позицию index в перестановке [0, ..., max_index].

Просмотреть псевдонимы

Псевдонимы для совместимости при миграции

Подробнее см. в руководстве по миграции.

tf.compat.v1.random.experimental.index_shuffle

tf.random.experimental.index_shuffle(
    index, seed, max_index
)

Для каждой возможной пары seed и max_index существует одна псевдослучайная перестановка последовательности S=[0, ..., max_index]. Вместо материализации всего массива мы можем вычислить новую позицию любого целого числа i (0 <= i <= max_index) в S. Это может быть полезно для очень больших max_index, поскольку позволяет избежать выделения больших объемов памяти.

В простейшем случае index и max_index — скаляры, а seed — вектор длины 2 (как обычно бывает для RNG без состояния). Однако ко всем ним можно добавить ведущую размерность пакета. Если у некоторых из них размерности пакета нет, а у других есть, index_shuffle добавит размерность пакета к первым с помощью широковещательного распространения.

Входное значение index и выходные данные можно использовать в качестве индексов для перемешивания вектора. Например:

vector = tf.constant(['e0', 'e1', 'e2', 'e3'])
indices = tf.random.experimental.index_shuffle(
  index=tf.range(4), seed=[5, 9], max_index=3)
print(indices)
tf.Tensor([2 0 1 3], shape=(4,), dtype=int32)
shuffled_vector = tf.gather(vector, indices)
print(shuffled_vector)
tf.Tensor([b'e2' b'e0' b'e1' b'e3'], shape=(4,), dtype=string)

Что еще полезнее, это можно использовать в потоковых (то есть онлайн-) сценариях, например, с tf.data, где каждый элемент vector обрабатывается отдельно, а весь vector никогда не материализуется в памяти.

dataset = tf.data.Dataset.range(10)
dataset = dataset.map(
 lambda idx: tf.random.experimental.index_shuffle(idx, [5, 8], 9))
print(list(dataset.as_numpy_iterator()))
[3, 8, 0, 1, 2, 7, 6, 9, 4, 5]

Эта операция не имеет состояния (как функции tf.random.stateless_*), то есть выходные данные полностью определяются значением seed (при прочих равных условиях). Каждому выбору seed соответствует одна перестановка, поэтому при многократном вызове этой функции для одного и того же перемешивания используйте одно и то же значение seed. Например:

seed = [5, 9]
idx0 = tf.random.experimental.index_shuffle(0, seed, 3)
idx1 = tf.random.experimental.index_shuffle(1, seed, 3)
idx2 = tf.random.experimental.index_shuffle(2, seed, 3)
idx3 = tf.random.experimental.index_shuffle(3, seed, 3)
shuffled_vector = tf.gather(vector, [idx0, idx1, idx2, idx3])
print(shuffled_vector)
tf.Tensor([b'e2' b'e0' b'e1' b'e3'], shape=(4,), dtype=string)
Аргументы
index Тензор-скаляр целочисленного типа или вектор со значениями в [0, max_index]. Его можно рассматривать как значение v в последовательности S=[0, ..., max_index], которое нужно переставить, либо как индекс элемента e в перемешанном векторе.
seed Тензор формы [2] или [n, 2] с типом данных int32, uint32, int64 или uint64. Начальное значение RNG. Если ранг неизвестен во время построения графа, во время выполнения он должен быть равен 1.
max_index Неотрицательный тензор той же формы и типа данных, что и index. Верхняя граница (включительно).
Возвращает
Если все входные данные были скалярами (форма [2] для seed), результатом будет скаляр того же типа данных, что и index. Результат можно рассматривать как новую позицию v в S либо как индекс e вектора до перемешивания. Если один или несколько входных данных были векторами (форма [n, 2] для seed), результатом будет вектор того же размера, элементы которого перемешиваются независимо друг от друга. В этом случае скалярные значения распространяются на все элементы.

© 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/experimental/index_shuffle

Spec-Zone.ru

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