如何使用tf.tile实现TensorFlow张量的分块式重复?
嘿,这个问题我刚好有实操经验,给你一步步拆解清楚!
首先咱们先明确下「分块式重复」的需求:比如你的原张量是[[1],[2],[3],[10],[20],[30]],假设咱们按每3个元素为一个块(也就是[[1],[2],[3]]和[[10],[20],[30]]这两个块),想要的结果是每个块整体重复N次,比如重复2次后输出就是:
array([[ 1], [ 2], [ 3], [ 1], [ 2], [ 3], [10], [20], [30], [10], [20], [30]], dtype=int32)
用tf.tile配合形状变换就能轻松实现,核心思路是:先把原张量按块大小拆成多维度结构,再对块的维度做重复,最后还原成目标形状。
具体实现步骤
1. 先将原张量按块大小重塑
假设咱们设定块大小为3,先把原形状(6,1)的张量重塑为(块数, 块大小, 1)的结构,让每个块成为独立的维度单元:
import tensorflow as tf a = tf.constant([[1], [2], [3], [10], [20], [30]], dtype=tf.int32) block_size = 3 # 每个块包含的元素数 # 用-1让TensorFlow自动计算块数(这里6/3=2) a_blocked = tf.reshape(a, (-1, block_size, 1))
2. 用tf.tile实现块的重复
我们需要给每个块新增一个「重复维度」,然后在这个维度上用tf.tile复制:
repeat_times = 2 # 每个块要重复的次数 # 先给分块后的张量新增一个维度,变成(块数, 1, 块大小, 1) a_block_expanded = tf.expand_dims(a_blocked, axis=1) # 在新增的维度上重复,得到(块数, repeat_times, 块大小, 1) a_block_repeated = tf.tile(a_block_expanded, [1, repeat_times, 1, 1])
3. 重塑回目标形状
最后把多维度的张量重新展平成(总元素数, 1)的形状:
a_final = tf.reshape(a_block_repeated, (-1, 1))
运行验证的话,用Session执行就能得到预期结果:
with tf.Session() as sess: print(sess.run(a_final))
通用化写法
如果需要调整块大小和重复次数,直接修改block_size和repeat_times参数即可,比如块大小设为2、重复次数设为3,会得到这样的结果:
array([[ 1], [ 2], [ 1], [ 2], [ 1], [ 2], [ 3], [10], [ 3], [10], [ 3], [10], [20], [30], [20], [30], [20], [30]], dtype=int32)
补充:如果是整块重复
要是你想的是把整个原张量作为一个块重复N次,那就更简单了,直接用:
a_whole_repeated = tf.tile(a, [repeat_times, 1])
比如repeat_times=2,结果就是[[1],[2],[3],[10],[20],[30],[1],[2],[3],[10],[20],[30]]。
内容的提问来源于stack exchange,提问作者Maggie Pas
相关产品推荐
相关产品推荐

