以相同的顺序改组两个张量
shuffling two tensors in the same order
同上。我尝试了这些都无济于事:
tf.random.shuffle( (a,b) )
tf.random.shuffle( zip(a,b) )
我曾经将它们连接起来并进行洗牌,然后取消连接/解压。但是现在我处于 (a) 是 4D 阶张量而 (b) 是一维阶张量的情况,所以,无法连接。
我还尝试将 seed 参数提供给 shuffle 方法,以便它重现相同的洗牌,我使用了两次 => 失败。还尝试用随机洗牌的数字范围自己洗牌,但 TF 在花式索引和东西方面不如 numpy 灵活 ==> 失败。
我现在正在做的是,将所有内容转换回 numpy,然后使用 sklearn 中的 shuffle,然后通过重铸返回到张量。这是纯粹的愚蠢方式。这应该发生在图表中。
您可以只打乱索引,然后使用 tf.gather()
提取与那些打乱的索引对应的值:
TF2.x(更新)
import tensorflow as tf
import numpy as np
x = tf.convert_to_tensor(np.arange(5))
y = tf.convert_to_tensor(['a', 'b', 'c', 'd', 'e'])
indices = tf.range(start=0, limit=tf.shape(x)[0], dtype=tf.int32)
shuffled_indices = tf.random.shuffle(indices)
shuffled_x = tf.gather(x, shuffled_indices)
shuffled_y = tf.gather(y, shuffled_indices)
print('before')
print('x', x.numpy())
print('y', y.numpy())
print('after')
print('x', shuffled_x.numpy())
print('y', shuffled_y.numpy())
# before
# x [0 1 2 3 4]
# y [b'a' b'b' b'c' b'd' b'e']
# after
# x [4 0 1 2 3]
# y [b'e' b'a' b'b' b'c' b'd']
TF1.x
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, (None, 1, 1, 1))
y = tf.placeholder(tf.int32, (None))
indices = tf.range(start=0, limit=tf.shape(x)[0], dtype=tf.int32)
shuffled_indices = tf.random.shuffle(indices)
shuffled_x = tf.gather(x, shuffled_indices)
shuffled_y = tf.gather(y, shuffled_indices)
确保在同一会话 运行 中计算 shuffled_x
、shuffled_y
。否则他们可能会得到不同的索引排序。
# Testing
x_data = np.concatenate([np.zeros((1, 1, 1, 1)),
np.ones((1, 1, 1, 1)),
2*np.ones((1, 1, 1, 1))]).astype('float32')
y_data = np.arange(4, 7, 1)
print('Before shuffling:')
print('x:')
print(x_data.squeeze())
print('y:')
print(y_data)
with tf.Session() as sess:
x_res, y_res = sess.run([shuffled_x, shuffled_y],
feed_dict={x: x_data, y: y_data})
print('After shuffling:')
print('x:')
print(x_res.squeeze())
print('y:')
print(y_res)
Before shuffling:
x:
[0. 1. 2.]
y:
[4 5 6]
After shuffling:
x:
[1. 2. 0.]
y:
[5 6 4]
同上。我尝试了这些都无济于事:
tf.random.shuffle( (a,b) )
tf.random.shuffle( zip(a,b) )
我曾经将它们连接起来并进行洗牌,然后取消连接/解压。但是现在我处于 (a) 是 4D 阶张量而 (b) 是一维阶张量的情况,所以,无法连接。
我还尝试将 seed 参数提供给 shuffle 方法,以便它重现相同的洗牌,我使用了两次 => 失败。还尝试用随机洗牌的数字范围自己洗牌,但 TF 在花式索引和东西方面不如 numpy 灵活 ==> 失败。
我现在正在做的是,将所有内容转换回 numpy,然后使用 sklearn 中的 shuffle,然后通过重铸返回到张量。这是纯粹的愚蠢方式。这应该发生在图表中。
您可以只打乱索引,然后使用 tf.gather()
提取与那些打乱的索引对应的值:
TF2.x(更新)
import tensorflow as tf
import numpy as np
x = tf.convert_to_tensor(np.arange(5))
y = tf.convert_to_tensor(['a', 'b', 'c', 'd', 'e'])
indices = tf.range(start=0, limit=tf.shape(x)[0], dtype=tf.int32)
shuffled_indices = tf.random.shuffle(indices)
shuffled_x = tf.gather(x, shuffled_indices)
shuffled_y = tf.gather(y, shuffled_indices)
print('before')
print('x', x.numpy())
print('y', y.numpy())
print('after')
print('x', shuffled_x.numpy())
print('y', shuffled_y.numpy())
# before
# x [0 1 2 3 4]
# y [b'a' b'b' b'c' b'd' b'e']
# after
# x [4 0 1 2 3]
# y [b'e' b'a' b'b' b'c' b'd']
TF1.x
import tensorflow as tf
import numpy as np
x = tf.placeholder(tf.float32, (None, 1, 1, 1))
y = tf.placeholder(tf.int32, (None))
indices = tf.range(start=0, limit=tf.shape(x)[0], dtype=tf.int32)
shuffled_indices = tf.random.shuffle(indices)
shuffled_x = tf.gather(x, shuffled_indices)
shuffled_y = tf.gather(y, shuffled_indices)
确保在同一会话 运行 中计算 shuffled_x
、shuffled_y
。否则他们可能会得到不同的索引排序。
# Testing
x_data = np.concatenate([np.zeros((1, 1, 1, 1)),
np.ones((1, 1, 1, 1)),
2*np.ones((1, 1, 1, 1))]).astype('float32')
y_data = np.arange(4, 7, 1)
print('Before shuffling:')
print('x:')
print(x_data.squeeze())
print('y:')
print(y_data)
with tf.Session() as sess:
x_res, y_res = sess.run([shuffled_x, shuffled_y],
feed_dict={x: x_data, y: y_data})
print('After shuffling:')
print('x:')
print(x_res.squeeze())
print('y:')
print(y_res)
Before shuffling:
x:
[0. 1. 2.]
y:
[4 5 6]
After shuffling:
x:
[1. 2. 0.]
y:
[5 6 4]