我有以下表达式给我带来了问题。我已将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)
当我尝试打印状态大小时,我也得到(?,?)但是当我尝试使用它时它并没有真正抛出任何异常。
答案 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
,因此静态形状推断报告?
。