首页 文章

平铺张量的张量流形状

提问于
浏览
5

我有一个变量 a 维度(1,5),我希望'tile'与我的小批量的大小一样多 . 例如,如果小批量大小为32,那么我想构建一个维度(32,5)的张量 c ,其中每一行的值与原始(1,5)变量 a 相同 .

但我只知道运行时的小批量大小:它是占位符的维度0的大小 btf.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 回答

  • 4

    [ EDIT: 这已于2016年8月10日在commit修复为TensorFlow . ]

    这是TensorFlow形状推断的已知限制:当tf.tile()multiples 参数是计算值(例如tf.pack()此处的结果)时,其值在图形构造时不可轻易计算(在这种情况下,因为它依赖于一个tf.placeholder(),在它被送入之前没有任何 Value ),当前的形状推断会举手并声明形状未知(但与输入的排名相同, 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来跟踪这个,我现在正在测试一个修复程序 .

相关问题