平铺张量的 tensorflow 形状

标签 tensorflow

我有一个变量 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]))

这运行良好。然而c.get_shape()返回 (?, ?)。我不明白为什么这不返回 (?, 5) 。

当我构造矩阵变量 W 时,这会在我的代码中引起问题。列数 c.get_shape()[1]我希望返回 5 而不是 ?。

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

最佳答案

[ 编辑:这已在 commit 中修复2016 年 8 月 10 日到 TensorFlow。]

这是 TensorFlow 形状推断的一个已知限制:当 multiples tf.tile() 的参数是一个计算值(例如这里的 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跟踪这一点,我现在正在测试一个修复程序。

关于平铺张量的 tensorflow 形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38806136/

相关文章:

python - 如何在 TensorFlow while_loop 中赋值

python - 使用更快的 RCNN Inception Resnet 进行迁移学习 |为什么在第一个检查点之后的每个步骤都会保存新的检查点?

tensorflow - keras.model.predict 引发 ValueError : Error when checking input

python - 为训练 Tensorflow 网络提供 spark 数据帧的最佳实践

python - 如果条件输出改变,用@tf.function 装饰

python - tensorflow 、Python : ImportError: undefined symbol: _PyUnicode_AsWideCharString

python - tensorflow.contrib.learn.ExportStrategy 示例

tensorflow - 如何在第一个时期正确缓存数据(Tensorflow,数据集)?

python - 如何使用 TFF api 进行自定义使用?

tensorflow - 是否可以将已经训练好的 Keras 部署到 Sagemaker?