tf.random.experimental.index_shuffle
Stay organized with collections
Save and categorize content based on your preferences.
Outputs the position of index
in a permutation of [0, ..., max_index]
.
tf.random.experimental.index_shuffle(
index, seed, max_index
)
For each possible seed
and max_index
there is one pseudorandom
permutation of the sequence S=[0, ..., max_index]
. Instead of
materializing the full array we can compute the new position of any
integer i
(0 <= i <= max_index
) in S
. This can be useful for
very large max_index
s by avoiding allocating large chunks of
memory.
In the simplest case, index
and max_index
are scalars, and
seed
is a length-2 vector (as typical for stateless RNGs). But
you can add a leading batch dimension to all of them. If some of
them don't have the batch dimension while others do, index_shuffle
will add a batch dimension to the former by broadcasting.
The input index
and output can be used as indices to shuffle a
vector. For example:
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)
More usefully, it can be used in a streaming (aka online) scenario such as
tf.data
, where each element of vector
is processed individually and the
whole vector
is never materialized in memory.
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]
This operation is stateless (like the tf.random.stateless_*
functions), meaning the output is fully determined by the seed
(other inputs being equal). Each seed
choice corresponds to one
permutation, so when calling this function multiple times for the
same shuffling, please make sure to use the same seed
. For
example:
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)
Args |
index
|
An integer scalar tensor or vector with values in [0, max_index] .
It can be seen as either a value v in the sequence S=[0, ...,
max_index] to be permutated, or as an index of an element e in a
shuffled vector.
|
seed
|
A tensor of shape [2] or [n, 2] with dtype int32 , uint32 , int64
or uint64 . The RNG seed. If the rank is unknown during graph-building
time it must be 1 at runtime.
|
max_index
|
A non-negative tensor with the same shape and dtype as index .
The upper bound (inclusive).
|
Returns |
If all inputs were scalar (shape [2] for seed ), the output will
be a scalar with the same dtype as index . The output can be seen
as the new position of v in S , or as the index of e in the
vector before shuffling. If one or multiple inputs were vectors
(shape [n, 2] for seed ), then the output will be a vector of the
same size which each element shuffled independently. Scalar values
are broadcasted in this case.
|
Except as otherwise noted, the content of this page is licensed under the Creative Commons Attribution 4.0 License, and code samples are licensed under the Apache 2.0 License. For details, see the Google Developers Site Policies. Java is a registered trademark of Oracle and/or its affiliates. Some content is licensed under the numpy license.
Last updated 2024-04-26 UTC.
[[["Easy to understand","easyToUnderstand","thumb-up"],["Solved my problem","solvedMyProblem","thumb-up"],["Other","otherUp","thumb-up"]],[["Missing the information I need","missingTheInformationINeed","thumb-down"],["Too complicated / too many steps","tooComplicatedTooManySteps","thumb-down"],["Out of date","outOfDate","thumb-down"],["Samples / code issue","samplesCodeIssue","thumb-down"],["Other","otherDown","thumb-down"]],["Last updated 2024-04-26 UTC."],[],[],null,["# tf.random.experimental.index_shuffle\n\n\u003cbr /\u003e\n\n|----------------------------------------------------------------------------------------------------------------------------------------|\n| [View source on GitHub](https://github.com/tensorflow/tensorflow/blob/v2.16.1/tensorflow/python/ops/stateless_random_ops.py#L135-L223) |\n\nOutputs the position of `index` in a permutation of `[0, ..., max_index]`.\n\n#### View aliases\n\n\n**Compat aliases for migration**\n\nSee\n[Migration guide](https://www.tensorflow.org/guide/migrate) for\nmore details.\n\n[`tf.compat.v1.random.experimental.index_shuffle`](https://www.tensorflow.org/api_docs/python/tf/random/experimental/index_shuffle)\n\n\u003cbr /\u003e\n\n tf.random.experimental.index_shuffle(\n index, seed, max_index\n )\n\nFor each possible `seed` and `max_index` there is one pseudorandom\npermutation of the sequence `S=[0, ..., max_index]`. Instead of\nmaterializing the full array we can compute the new position of any\ninteger `i` (`0 \u003c= i \u003c= max_index`) in `S`. This can be useful for\nvery large `max_index`s by avoiding allocating large chunks of\nmemory.\n\nIn the simplest case, `index` and `max_index` are scalars, and\n`seed` is a length-2 vector (as typical for stateless RNGs). But\nyou can add a leading batch dimension to all of them. If some of\nthem don't have the batch dimension while others do, `index_shuffle`\nwill add a batch dimension to the former by broadcasting.\n\nThe input `index` and output can be used as indices to shuffle a\nvector. For example: \n\n vector = tf.constant(['e0', 'e1', 'e2', 'e3'])\n indices = tf.random.experimental.index_shuffle(\n index=tf.range(4), seed=[5, 9], max_index=3)\n print(indices)\n tf.Tensor([2 0 1 3], shape=(4,), dtype=int32)\n shuffled_vector = tf.gather(vector, indices)\n print(shuffled_vector)\n tf.Tensor([b'e2' b'e0' b'e1' b'e3'], shape=(4,), dtype=string)\n\nMore usefully, it can be used in a streaming (aka online) scenario such as\n[`tf.data`](../../../tf/data), where each element of `vector` is processed individually and the\nwhole `vector` is never materialized in memory. \n\n dataset = tf.data.Dataset.range(10)\n dataset = dataset.map(\n lambda idx: tf.random.experimental.index_shuffle(idx, [5, 8], 9))\n print(list(dataset.as_numpy_iterator()))\n [3, 8, 0, 1, 2, 7, 6, 9, 4, 5]\n\nThis operation is stateless (like the `tf.random.stateless_*`\nfunctions), meaning the output is fully determined by the `seed`\n(other inputs being equal). Each `seed` choice corresponds to one\npermutation, so when calling this function multiple times for the\nsame shuffling, please make sure to use the same `seed`. For\nexample: \n\n seed = [5, 9]\n idx0 = tf.random.experimental.index_shuffle(0, seed, 3)\n idx1 = tf.random.experimental.index_shuffle(1, seed, 3)\n idx2 = tf.random.experimental.index_shuffle(2, seed, 3)\n idx3 = tf.random.experimental.index_shuffle(3, seed, 3)\n shuffled_vector = tf.gather(vector, [idx0, idx1, idx2, idx3])\n print(shuffled_vector)\n tf.Tensor([b'e2' b'e0' b'e1' b'e3'], shape=(4,), dtype=string)\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Args ---- ||\n|-------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|\n| `index` | An integer scalar tensor or vector with values in `[0, max_index]`. It can be seen as either a value `v` in the sequence `S=[0, ..., max_index]` to be permutated, or as an index of an element `e` in a shuffled vector. |\n| `seed` | A tensor of shape \\[2\\] or \\[n, 2\\] with dtype `int32`, `uint32`, `int64` or `uint64`. The RNG seed. If the rank is unknown during graph-building time it must be 1 at runtime. |\n| `max_index` | A non-negative tensor with the same shape and dtype as `index`. The upper bound (inclusive). |\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n\u003cbr /\u003e\n\n| Returns ------- ||\n|---|---|\n| If all inputs were scalar (shape \\[2\\] for `seed`), the output will be a scalar with the same dtype as `index`. The output can be seen as the new position of `v` in `S`, or as the index of `e` in the vector before shuffling. If one or multiple inputs were vectors (shape \\[n, 2\\] for `seed`), then the output will be a vector of the same size which each element shuffled independently. Scalar values are broadcasted in this case. ||\n\n\u003cbr /\u003e"]]