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]. Вместо того, чтобы создавать весь массив, мы можем вычислить новое положение любого отдельного элемента в S. Это может быть полезно для очень больших max_index.
Входной index и выходные данные могут быть использованы в качестве индексов для перемешивания вектора. Например:
vector = tf.constant(['e0', 'e1', 'e2', 'e3']) indices = tf.random.experimental.index_shuffle(tf.range(4), [5, 9], 3) 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. Зерно генератора случайных чисел. Если ранг неизвестен во время построения графа, он должен быть 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/versions/r2.9/api_docs/python/tf/random/experimental/index_shuffle