平铺张量的张量流形状

时间:2016-08-06 15:58:59

标签: tensorflow

我有一个维度{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而不是?时,这会导致我的代码出现问题。

任何帮助将不胜感激。感谢。

1 个答案:

答案 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来跟踪这个问题,我现在正在测试修复程序。