如何使用tf.random.uniform生成无重复的随机整数索引
TensorFlow生成无重复随机整数索引的解决方案
你当前使用的tf.random.uniform属于有放回抽样,每次生成的数值相互独立,因此必然会出现重复值。要获得无重复的随机索引,改用无放回随机抽样的实现即可,下面给出两种可行方案:
方案1:使用tf.random.choice(推荐,代码最简)
TensorFlow原生提供的随机抽样API,直接设置replace=False即可实现不放回抽样,天然保证结果无重复,替换后的代码如下:
indices = tf.random.choice( size_for_layer[index], # 抽样的总值域上限,对应原代码的maxval参数 size=[size_for_layer_submodel[index], ], # 输出张量的shape,对应原代码的shape参数 replace=False, # 核心参数:不放回抽样,避免重复值 dtype=tf.dtypes.int64, seed=seed )
注意事项:
- 需满足
size_for_layer_submodel[index] ≤ size_for_layer[index],否则会触发参数错误,这是无放回抽样的逻辑限制:无法从N个元素中抽出多于N个的不重复值。 - 该API在TensorFlow 2.4及以上版本稳定可用,低版本TensorFlow可使用下面的方案2。
方案2:打乱序列后切片(兼容性最好)
逻辑是先生成0到maxval-1的完整连续整数序列,打乱顺序后取前N个,结果天然无重复,代码如下:
# 生成完整的索引序列 full_indices = tf.range(size_for_layer[index], dtype=tf.dtypes.int64) # 随机打乱序列顺序 shuffled_indices = tf.random.shuffle(full_indices, seed=seed) # 截取前N个元素作为最终结果 indices = shuffled_indices[:size_for_layer_submodel[index]]
注意事项:如果size_for_layer[index]数值极大(如超过1e6),该方案会生成一个很长的临时张量,占用更多内存,这种场景优先使用方案1。
内容的提问来源于stack exchange,提问作者kevinDong
相关产品推荐
相关产品推荐

