我有一个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]))
Run Code Online (Sandbox Code Playgroud)
这很好.但是c.get_shape()返回(?,?).我不明白为什么这不会返回(?,5).
当我构造一个W具有列数的矩阵变量时,这会导致我的代码稍后出现问题c.get_shape()[1],我期望返回5而不是?
任何帮助,将不胜感激.谢谢.
[编辑:此问题已在 2016 年 8 月 10 日提交给 TensorFlow 时修复。]
这是 TensorFlow 形状推断的一个已知限制:当 的multiples参数tf.tile()是一个计算值(例如tf.pack()此处的结果),并且其值在图构造时不可简单计算(在这种情况下,因为它依赖于 a 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])`
Run Code Online (Sandbox Code Playgroud)
然而,我们最近添加了一些功能,可以传播可用作形状的部分计算值,并且可以对其进行调整以帮助 的形状函数tf.tile()。我创建了一个GitHub 问题来跟踪此问题,并且现在正在测试修复程序。
| 归档时间: |
|
| 查看次数: |
4666 次 |
| 最近记录: |