0

I have following two tensorflow placeholders:

Tensor("Placeholder:0", shape=(32, 2048), dtype=float32)
Tensor("Placeholder:1", shape=(64, 2048), dtype=float32)

Let's call them a and b. I want to stack them and then shuffle randomly. Afterwards, I want to pass them through network. Finally, I want to get the back the a and b before stack and shuffle

What I have done so far

I understand stacking and random shuffle. Therefore, guide me how I can stack them, shuffle them, and finally get back the original indexes.

cswah
  • 401
  • 1
  • 5
  • 22

1 Answers1

2

You can create a shuffle index on the concatenated matrix, so that we know the elements that got shuffled went where and then we can put together back in order using argsort of the indices.

Inputs:

a = tf.random.normal(shape=(32, 2048), dtype=tf.float32)
b = tf.random.normal(shape=(64, 2048), dtype=tf.float32)

Stack the arrays:

c = tf.concat([a,b], axis=0)

Random shuffle:

indices = tf.range(start=0, limit=tf.shape(c)[0], dtype=tf.int32)
shuffled_indices = tf.random.shuffle(indices) #shuffled index will tell where each element of c went.
shuffled_c = tf.gather(c, shuffled_indices)

Get back c, a, b:

getback_c = tf.gather(shuffled_c, tf.argsort(shuffled_indices))
a_1, b_1 = getback_c[:tf.shape(a)[0]], getback_c[tf.shape(a)[0]:]

Verify the values are same:

np.testing.assert_allclose(a.numpy(), a_1.numpy())
np.testing.assert_allclose(b.numpy(), b_1.numpy())
Vijay Mariappan
  • 16,921
  • 3
  • 40
  • 59