gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 00:55:33 24 4
gpt4 key购买 nike

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

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

最佳答案

您正在混合静态形状和动态形状。静态形状是您在 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覆盖 aop与 2. 因此静态形状推断报告 ?对于那个维度。

关于tensorflow - 为什么tensorflow不能确定这个表达式的形状?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37881917/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com