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 (как обычно для бессостоятельных генераторов случайных чисел). Но вы можете добавить ведущий пакетный размер ко всем им. Если у некоторых из них нет пакетного измерения, а у других есть, 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. Зерно генератора случайных чисел. Если ранг неизвестен во время построения графа, он должен быть равен 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