TensorFlow tf.tile抛出TypeError:预期单个张量却传入张量列表
解决TensorFlow中tf.tile使用张量作为倍数参数的错误
你遇到的问题核心在于 tf.tile的第二个参数(重复次数)必须是静态可确定的整数序列,但你代码里的m是一个TensorFlow张量(由max_rating - min_rating + 1计算得到),不是Python原生整数。TensorFlow在构建计算图时无法提前确定这个张量的数值,因此会抛出错误。
下面给你两种针对性的解决方案:
方案一:如果min/max_rating是固定常量(你的场景)
既然min_rating和max_rating都是固定的tf.constant,可以先把m转换成Python整数,再传给tf.tile:
import tensorflow as tf min_rating = tf.constant(0, tf.int64) max_rating = tf.constant(12, tf.int64) # 先在会话中计算出m的Python整数值 with tf.Session() as sess: m = sess.run(max_rating - min_rating + 1) k = tf.range(m, dtype=tf.int64) d = tf.tile(k, [m]) with tf.Session() as sess: a = sess.run([d]) print(a)
或者更直接一点,因为你已经知道min=0、max=12,手动计算m=13也行,上面的写法更通用,适合后续调整常量值的情况。
方案二:如果min/max_rating是动态值(比如来自输入)
如果min_rating和max_rating是动态变化的(比如占位符或者模型输入),可以用tf.repeat替代tf.tile——tf.repeat支持用张量指定重复次数,正好适配你的需求:
import tensorflow as tf min_rating = tf.constant(0, tf.int64) max_rating = tf.constant(12, tf.int64) m = max_rating - min_rating + 1 k = tf.range(m, dtype=tf.int64) # 使用tf.repeat,支持张量作为重复次数参数 d = tf.repeat(k, m) with tf.Session() as sess: a = sess.run([d]) print(a)
如果你用的是TensorFlow 1.x早期版本(不支持tf.repeat),可以用tf.expand_dims+tf.tile+tf.reshape的组合来实现:
import tensorflow as tf min_rating = tf.constant(0, tf.int64) max_rating = tf.constant(12, tf.int64) m = max_rating - min_rating + 1 k = tf.range(m, dtype=tf.int64) # 先扩展维度为二维,再按列重复m次,最后拉平成一维数组 k_expanded = tf.expand_dims(k, 1) tiled = tf.tile(k_expanded, [1, m]) d = tf.reshape(tiled, [-1]) with tf.Session() as sess: a = sess.run([d]) print(a)
简单总结下:tf.tile是对整个张量进行块级重复,需要提前知道重复次数的数值;而tf.repeat是对每个元素单独重复,支持动态的重复次数张量,更适合你的场景。
内容的提问来源于stack exchange,提问作者smanna
相关产品推荐
相关产品推荐

