tf.random.experimental.index_shuffle
Возвращает позицию index в перестановке [0, ..., max_index].
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