我有一个维度{1,5}的变量a
我想要' tile'和我的小批量一样多的次数。例如,如果小批量大小为32,那么我想构建一个维度的张量c
(32,5),其中每一行的值与原始的(1,5)变量{{1}相同}。
但我只知道运行时的小批量大小:它是占位符a
的维度0的大小:b
这是构建c:
的代码tf.shape(b)[0]
这很好。但是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]))
返回(?,?)。我不明白为什么这不会返回(?,5)。
当我构建一个列数为c.get_shape()
的矩阵变量W
并且我希望返回5而不是?时,这会导致我的代码出现问题。
任何帮助将不胜感激。感谢。
答案 0 :(得分:4)
[编辑:这已于2016年8月10日在commit修复为TensorFlow。]
这是TensorFlow形状推断的已知限制:当tf.tile()
的multiples
参数是计算值(例如此处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来跟踪这个问题,我现在正在测试修复程序。