为什么 tensorflow 不能确定这个表达式的形状?

Why can't tensorflow determine the shape of this expression?

我有以下表达方式,这给我带来了问题。我已将 batch_size 定义为 batch_size = tf.shape(input_tensor)[0],它根据模型输入张量的大小动态确定批处理的大小。我在代码的其他地方使用它没有问题。我感到困惑的是,当我 运行 下面的代码行说形状是 (?, ?) 我希望它是 (?, 128) 因为它知道第二个维度。

print(tf.zeros((batch_size, 128)).get_shape())

我想知道形状,因为我正在尝试执行以下操作但出现错误。

    rnn_input = tf.reduce_sum(w * decoder_input, 1)
    last_out = decoder_outputs[t - 1] if t else tf.zeros((batch_size, 128))
    rnn_input = tf.concat(1, (rnn_input, last_out))

此代码需要在第一个时间步将 last_out 设置为零。

这里是错误ValueError: Linear expects shape[1] of arguments: [[None, None], [None, 1024]]

当我确定 RNN 的初始状态向量时,我正在做类似的事情。

state = tf.zeros((batch_size, decoder_multi_rnn.state_size), tf.float32)

当我尝试打印状态大小时我也得到 (?, ?) 但当我尝试使用它时它并没有真正抛出任何异常。

(编辑:我重写了一个答案,因为我之前写的不是重点)

快速解决问题的方法是使用 set_shape() 更新张量的静态(推断)形状:

input_tensor = tf.placeholder(tf.float32, [None, 32])
batch_size = tf.shape(input_tensor)[0]

res = tf.zeros((batch_size, 128))
print res.get_shape()  # prints (?, ?) WHEREAS one could expect (?, 128)

res.set_shape([None, 128])
print res.get_shape()  # prints (?, 128)

至于为什么TensorFlow会丢失第二个维度为128的信息,我不太清楚。

也许@Yaroslav 可以回答。

编辑: 在 this issue 之后更正了不正确的行为。

您正在混合静态形状和动态形状。静态形状是您在 tensor.get_shape(tensor) 期间获得的,这是尽力获得形状的尝试,而动态形状来自 sess.run(tf.shape(tensor)) 并且始终被定义。

更准确地说,tf.shape(tensor) 在图中创建了一个运算,它将在 run 调用时生成形状张量。如果你这样做 aop=tf.shape(tensor)[0],通过 _SliceHelper 会有一些魔法,它会添加额外的操作,这些操作将在 run 调用时提取形状张量的第一个元素。

这意味着 myval=tf.zeros((aop, 128)) 必须 运行 aop 才能获得维度,这意味着 myval 的第一个维度是未定义的,直到您发出 run 打电话。 IE,您的 运行 调用可能看起来像 sess.run(myval, feed_dict={aop:2},其中 feed_dict 用 2 覆盖 aop。因此静态形状推断报告 ? 该维度。