我有一个变量 a
维度(1,5),我希望'tile'与我的小批量的大小一样多 . 例如,如果小批量大小为32,那么我想构建一个维度(32,5)的张量 c
,其中每一行的值与原始(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而不是?
任何帮助,将不胜感激 . 谢谢 .
1 回答
[ EDIT: 这已于2016年8月10日在commit修复为TensorFlow . ]
这是TensorFlow形状推断的已知限制:当tf.tile()的
multiples
参数是计算值(例如tf.pack()此处的结果)时,其值在图形构造时不可轻易计算(在这种情况下,因为它依赖于一个tf.placeholder(),在它被送入之前没有任何 Value ),当前的形状推断会举手并声明形状未知(但与输入的排名相同,a
) .当前的解决方法是使用Tensor.set_shape(),它允许您作为程序员提供额外的形状信息,当您知道的不仅仅是形状推断 . 例如,您可以这样做:
但是,我们最近添加了一些功能,可以传播可以用作形状的部分计算值,这可以用于辅助
tf.tile()
的形状函数 . 我创建了一个GitHub issue来跟踪这个,我现在正在测试一个修复程序 .