gpt4 book ai didi

python - 在 TensorFlow 中展平张量的最后两个维度

转载 作者:太空狗 更新时间:2023-10-30 02:38:25 25 4
gpt4 key购买 nike

我正在尝试将张量从 [A, B, C, D] reshape 为 [A, B, C * D] 并将其输入到动态rnn。假设我事先不知道 B、C 和 D(它们是卷积网络的结果)。

我认为在 Theano 中这样的 reshape 看起来像这样:

x = x.flatten(ndim=3)

似乎在 TensorFlow 中没有简单的方法可以做到这一点,到目前为止,这是我想出的方法:

x_shape = tf.shape(x)
x = tf.reshape(x, [batch_size, x_shape[1], tf.reduce_prod(x_shape[2:])]

即使 x 的形状在图形构建过程中已知(即 print(x.get_shape()) 打印出绝对值,如 [10, 20, 30, 40] reshape get_shape() 后变为 [10, None, None]。同样,仍然假设初始形状未知所以我不能用绝对值来操作。

当我将 x 传递给 dynamic_rnn 时,它失败了:

ValueError: Input size (depth of inputs) must be accessible via shape inference, but saw value None.

为什么 reshape 无法处理这种情况?在 TensorFlow 中使用 4 阶或更高阶张量复制 Theano 的 flatten(ndim=n) 的正确方法是什么?

最佳答案

这不是reshape的缺陷,而是tf.dynamic_rnn的限制。

您用于展平最后两个维度的代码是正确的。而且,reshape 的行为也正确:如果在定义展平操作时最后两个维度是未知的,那么它们的乘积也是未知的,None 是唯一合适的值此时返回。

罪魁祸首是 tf.dynamic_rnn,它期望在构建期间有一个完全定义的特征形状,即除了第一个(批量大小)和第二个(时间步长)之外的所有维度都必须已知。也许有点不幸,但当前的实现似乎不允许 RNN 具有可变数量的特征,就像 FCN。

关于python - 在 TensorFlow 中展平张量的最后两个维度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47033886/

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