Tensorflow tf.unstack具有动态形状
我正在尝试解叠加张量,因为我需要一个序列作为RNN的输入。我正在使用可变序列长度,这会妨碍我正确使用Tensorflow tf.unstack具有动态形状,tensorflow,Tensorflow,我正在尝试解叠加张量,因为我需要一个序列作为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.tran
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
,但是我得到了参数'num'的预期int,而不是我相信这可能在其他地方得到了回答,但这里有一个答案。不能对不可推断的维度使用tf.unstack
。
这是因为tensorflow是如何通过定义张量变换的计算图来设计的。每个操作添加一个节点,每个张量是节点之间的一条边。当您tf.unstack
一个张量时,您将生成多个新的张量(边)。如果通过tf.unstack
操作创建的新张量的数量未定义,则计算图具有未定义的边数,这些边数不得为空。
不向图形添加多条新边的操作允许具有推断维度的输入张量(大多数操作)
要绕过此问题,有两种选择对批处理操作非常有用,即当您尝试tf时。可以推断出具有尺寸(批处理大小,…)
和批处理大小的张量
选择1
我将使用batch\u shape
参数keras.topology.Input
。
生成的重量张量始终可以与使用不同的批大小生成的另一个模型互换
除非您需要访问具有该不可推断维度的计算图,否则没有理由不使用该路径
选择2
第二个选项是,当您知道最大的批量大小时,使用
当您实际给出一个batch\u size
时,它将为第一个batch\u size
索引生成未堆叠的Tesor,并为其余索引生成[]
空张量。这是不受支持的--在图形编译期间必须知道输出的数量。但是,每个输出都可以有任意长度。但是我可以删除空的张量吗?我尝试过的结果表明分区需要有与张量的第一个维度精确的维度数。否则,程序将崩溃。这意味着该方法不适用于未知的输入形状。num_分区对于更大的分区是可以的,但对于“分区”是不行的。@Brandon,是的,你是对的,这个评论拯救了我的一天!我的最终解决方案是num\u partitions=max\u batch\u size
和partitions=tf.range(tf.shape(tensor)[0])
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')