为什么“张量流”不能确定这个表达式的形状?

时间:2016-06-17 12:45:20

标签: tensorflow

我有以下表达式给我带来了问题。我已将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)

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

2 个答案:

答案 0 :(得分:3)

(编辑:我改写了一个答案,因为我之前所写的内容并没有达到目的)

快速解决您的问题是使用set_shape()更新Tensor的静态(推断)形状:

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后更正了错误的行为。

答案 1 :(得分:2)

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

更准确地说,tf.shape(tensor)在图表中创建了一个op,它会在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会覆盖aop,因此静态形状推断报告?