gpt4 book ai didi

tensorflow - 具有动态形状的 tf.unstack

转载 作者:行者123 更新时间:2023-12-04 01:03:52 27 4
gpt4 key购买 nike

我正在尝试解开张量,因为我需要一个序列作为 RNN 的输入。我正在使用可变序列长度,这使我无法正确使用 tf.unstack .

def MapToSequences(x):
# x.get_shape().as_list() = [64, 1, None, 512]
x = tf.squeeze(x)
# tf.shape(x) = [None, None, None], at runtime would be [64, seqlen, 512]
x = tf.transpose(x, perm=[1, 0, 2])
# [seqlen, 64, 512]
# Here I'd like to unstack with seqlen as num
x = tf.unstack(x) # Cannot infer num from shape (?, ?, ?)
return x

我尝试使用 tf.shape(x)推断 seqlen 并将其用作 num ,但我得到 Expected int for argument 'num' not <tf.Tensor 'strided_slice:0' shape=() dtype=int32>

最佳答案

我相信这可能会在其他地方得到回答,但这里有一个答案。您不能将 tf.unstack 与不可推断的尺寸一起使用。这是因为 tensorflow 是如何使用定义张量转换的计算图设计的。每个操作增加一个节点,每个 Tensor 是节点之间的一条边。当你 tf.unstack 一个张量时,你会生成多个新的张量(边)。如果从 tf.unstack 操作创建的新张量的数量未定义,则计算图具有未定义的边数,该边数不得定义。不向图中添加多条新边的操作允许使用具有推断维度的输入张量(大多数操作)。

要解决这个问题,有两个选项对批处理操作很有用,即在您尝试 tf.unstack 尺寸为 (batch_size, .. .)batch_size 是可推断的。

选择 1

我会使用 keras.topology.Inputbatch_shape 参数。生成的权重张量将始终可以与使用不同 batch_size 生成的另一个模型互换。

除非您需要访问具有该不可推断维度的计算图,否则您没有理由不采用这条路线。

选择 2

第二个选项,在您知道最大 batch_size 的情况下,使用 tf.dynamic_partition .

tensor = tf.placeholder(tf.float32,shape=(None,10))
partitions = tf.range(max_batch_size)
num_partitions = max_batch_size
partitioned = tf.dynamic_partition(tensor, partitions, num_partitions, name='dynamic_unstack')

当你实际给出一个 batch_size 时,它将为第一个 batch_size 索引生成未堆叠的 Tesor,并为其余索引生成 [] 空张量。

关于tensorflow - 具有动态形状的 tf.unstack,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45404056/

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