gpt4 book ai didi

Tensorflow reshape 张量给出无维度

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

我使用了描述的模型 here在 0.6.0 分支上。代码可以在here中找到.我对链接的代码做了一些小的改动。

在我的代码中,我创建了两个模型,一个用于训练,一个用于验证,与 Tensorflow 教程中所做的非常相似。

with tf.variable_scope("model", reuse=None, initializer=initializer):
m = PTBModel_User(is_training=True, config=config, name='Training model')
with tf.variable_scope("model", reuse=True, initializer=initializer):
mtest = PTBModel_User(is_training=False, config=config_valid, name='Validation model')

第一个模型,用于训练的模型,似乎创建得很好,但用于验证的第二个模型却没有。输出得到一个 None 维度!我所指的行位于 linked 中的第 134 行代码:
output = tf.reshape(tf.concat(1, outputs), [-1, size])
我在输出 reshape 后立即添加了这些行:
output_shape = output.get_shape()
print("Model num_steps:", num_steps)
print("Model batch_size:", batch_size)
print("Output dims", output_shape[0], output_shape[1])

这给了我这个:
Model num_steps: 400
Model batch_size: 1
Output dims Dimension(None) Dimension(650)

这个问题只发生在“验证模型”,而不是“训练模型”。对于“训练模型”,我得到预期输出:
Model num_steps: 400
Model batch_size: 2
Output dims Dimension(800) Dimension(650)

(请注意,对于“验证模型”,我使用 batch_size=1 而不是我用于训练模型的 batch_size=2)

据我了解,使用 -1作为 reshape 的输入功能,将自动计算出输出形状!但是为什么我得到 None 呢?输入模型的配置中没有任何内容具有 None 值。

感谢您的所有帮助和提示!

最佳答案

TL;博士:维度是 None只是意味着形状推断无法确定 output 的确切形状。张量,在图形构建时。运行图形时,张量将具有适当的运行时形状。

如果您对形状推断的工作原理不感兴趣,现在可以停止阅读。

形状推理基于“形状函数”应用局部规则,该“形状函数”采用操作的输入形状并计算操作输出的(可能不完整的)形状。找出原因 tf.reshape() 给出一个不完整的形状,我们必须查看它的输入,然后向后工作:

  • shape论据 tf.reshape()包括 [-1] ,这意味着“根据 tensor 的形状自动计算输出形状”输入。
  • tensor输入是 tf.concat() 的输出在 same line .
  • tf.concat() 的输入由 tf.mul() 计算在 BasicLSTMCell.__call__() . tf.mul() op 乘以 tf.tanh() 的结果和一个 tf.sigmoid() 操作。
  • tf.tanh() op 产生大小为 [?, hidden_size] 的输出,以及 tf.sigmoid() op 产生大小为 [batch_size, hidden_size] 的输出.
  • tf.mul() op执行 NumPy-style broadcasting .一个维度只有在大小为 1 时才会被广播。考虑我们计算 tf.mul(x, y) 的三种情况。 :
  • x有形状[1, 10] , 和 y有形状[5, 10] ,然后广播将发生,输出形状将为 [5, 10] .
  • x有形状[1, 10] , 和 y有形状[1, 10] ,则不会有广播,输出形状为 [1, 10] .
  • 但是,如果 x有形状[1, 10] , 和 y有形状[?, 10] ,没有足够的静态信息来判断广播是否会发生(即使我们碰巧知道情况 2 在运行时适用)。

  • 因此,当 batch_size是 1, tf.mul() op 生成形状为 [?, hidden_size] 的输出;但是当 batch_size大于 1,输出形状为 [batch_size, hidden_size] .

    在形状推理失败的地方,可以适本地使用 Tensor.set_shape() 添加信息的方法。这在 BasicLSTMCell 中可能有用实现,我们知道的比推断输出形状的可能性要多。

    关于Tensorflow reshape 张量给出无维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36152571/

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