我有一个变量 a
尺寸 (1, 5) 我想“平铺”的次数与我的小批量的大小一样多。例如,如果小批量大小为 32,那么我想构造一个张量 c
维度为 (32, 5),其中每一行的值与原始 (1, 5) 变量 a
相同.
但我只知道运行时的小批量大小:它是占位符的维度 0 的大小 b
: tf.shape(b)[0]
这是我构造c的代码:
a = tf.Variable(np.random.uniform(size=(1,5)))
b = tf.placeholder(shape=[None, 12], dtype=tf.float32)
batch_size = tf.shape(b)[0]
c = tf.tile(a, tf.pack([batch_size, 1]))
这运行良好。然而
c.get_shape()
返回 (?, ?)。我不明白为什么这不返回 (?, 5) 。当我构造矩阵变量
W
时,这会在我的代码中引起问题。列数 c.get_shape()[1]
我希望返回 5 而不是 ?。任何帮助,将不胜感激。谢谢。
最佳答案
[ 编辑:这已在 commit 中修复2016 年 8 月 10 日到 TensorFlow。]
这是 TensorFlow 形状推断的一个已知限制:当 multiples
tf.tile()
的参数是一个计算值(例如这里的 tf.pack()
的结果),并且它的值在图构建时不是简单可计算的(在这种情况下,因为它依赖于 tf.placeholder()
,它在被馈送之前没有值) ,当前的形状推断将举手并声明形状是未知的(但与输入具有相同的等级,a
)。
当前的解决方法是使用 Tensor.set_shape()
,它允许你作为程序员在你知道的比形状推断更多的时候提供额外的形状信息。例如,您可以这样做:
a = tf.Variable(np.random.uniform(size=(1, 5)))
b = tf.placeholder(shape=[None, 12], dtype=tf.float32)
batch_size = tf.shape(b)[0]
c = tf.tile(a, tf.pack([batch_size, 1]))
c.set_shape([None, a.get_shape()[1]]) # or `c.set_shape([None, 5])`
但是,我们最近添加了一些功能,可以传播可用作形状的部分计算值,这可以用于帮助
tf.tile()
的形状函数。 .我创建了一个 GitHub issue跟踪这一点,我现在正在测试一个修复程序。
关于平铺张量的 tensorflow 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38806136/