When I use “tf.RaggedTensor.from_value_rowids”,
args “value_rowids” must be sorted in ascending order as written in the API description.
Then, how can I make a tensor sorted?
My concern is “values” must be sorted as the same index in which the “value_rowids” was sorted order.
ex) tensor [None, 390144, 2]
axis 1st “None” → batch size
axis 2nd “390144” → the number of data
axis 3rd “2” → [value_rowids, values]
You are correct in that (1) the value_rowids
need to be in ascending order and (2) the value_rowids
must correspond one-to-one with values
when using RaggedTensor
.
To sort a tensor with multiple dimensions like the one described, you can take advantage of argsort()
and gather()
to determine the sorted indices along a given axis and apply the new order, respectively.
Below, I illustrate how to do this with a randomly generated tensor:
# Create example tensor
batch_size = 3 # example value
data_size = 10 # 390144
value_size = 2
example_shape = [batch_size, data_size, value_size]
example_tensor = tf.random.uniform(example_shape)
# Determine indices with ascending order
sorted_idx = tf.argsort(example_tensor, axis=1, direction="ASCENDING")
sorted_idx = sorted_idx[:, :, 0] # Only check value_rowidx
# Order tensor by sorted indices
sorted_tensor = tf.gather(example_tensor, sorted_idx, batch_dims=1, axis=1)
The resulting sorted_tensor
should be sorted by the axis with value_rowids
if I understood the shape of the tensor you are starting with.
1 Like