我有以下两个tensorflow占位符:
Tensor("Placeholder:0", shape=(32, 2048), dtype=float32)
Tensor("Placeholder:1", shape=(64, 2048), dtype=float32)
我们称它们为a
和b
。我想随机地对它们进行stack
和shuffle
。之后,我想通过网络传递它们。最后,我想在stack
和shuffle
之前得到a
和b
我已经做了什么
我理解堆叠和随机洗牌。因此,请指导我如何堆叠它们、对它们进行洗牌,并最终获得原始索引。
你可以在连接矩阵上创建一个shuffle index
,这样我们就知道被洗牌的元素去了哪里,然后我们可以使用索引的argsort
将它们按顺序放回一起。
输入:
a = tf.random.normal(shape=(32, 2048), dtype=tf.float32)
b = tf.random.normal(shape=(64, 2048), dtype=tf.float32)
数组栈:
c = tf.concat([a,b], axis=0)
随机洗牌:
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)
返回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]:]
检查值是否相同:
np.testing.assert_allclose(a.numpy(), a_1.numpy())
np.testing.assert_allclose(b.numpy(), b_1.numpy())