在tf.function中,如何将tf.shape()获取的动态张量形状转换为python值,而不是张量本身?

在tf.function中,如何将tf.shape()获取的动态张量形状转换为python值,而不是张量本身?,python,tensorflow,Python,Tensorflow,我有一个来自tf.dataset的填充批,因为每个填充批的形状都不是固定的。所以我必须使用tf.shape方法来获得填充批的动态形状。问题是如何将tf.shape获得的张量形状转换为tf.function下的python值 @tf.function def train_step(padded_batch): shape = tf.shape(padded_batch) x = np.zeros(shape[0], shape[1]) 正如上面的代码一样,我想创建一个与padde

我有一个来自tf.dataset的填充批,因为每个填充批的形状都不是固定的。所以我必须使用tf.shape方法来获得填充批的动态形状。问题是如何将tf.shape获得的张量形状转换为tf.function下的python值

@tf.function
def train_step(padded_batch):
    shape = tf.shape(padded_batch)
    x = np.zeros(shape[0], shape[1])
正如上面的代码一样,我想创建一个与padded_batch形状相同的numpy数组,但是'shape'是一个张量,不能直接在numpy中使用


我使用的tensorflow版本是tf2.0

假设您有一个名为
a_tensor的张量:

this_is_a_regular_non_tensor_shape = a_tensor.shape.as_list()
(顺便说一句:您似乎没有正确使用
np.zero
。。您需要将形状作为单个元组/列表参数传递。每个维度没有单独的参数。例如:

shape = padded_batch.shape.as_list()
x = np.zeros(shape)
希望能有所帮助。)

如中所述

@tf.function或compat.v1上下文中,并非所有维度 直到执行时才知道。因此,在定义自定义图层时 对于图形模式,模型更喜欢动态tf.shape(x)而不是 静态x形

你的代码还可以。我只是用tf.zero替换了np.zero。@tf.function decorator表示代码将在图形模式下运行。图形中不允许使用numpy。在TF2.x中测试

@tf.function
def train_step(padded_batch):
    shape = tf.shape(padded_batch)
    return tf.zeros((shape[0], shape[1]))

这有用吗?如果没有,请告诉我遗漏了什么。如果是,请按照此“社区”中的预期向上投票/接受。shape属性用于静态形状,我使用tf.shape获取动态批处理的动态形状。由tf.shape返回的是一个张量,它没有as_list方法。但是动态形状直到会话运行时才定义,所以我不明白您期望的是什么。除非你的意思是在某些维度(例如批次维度)中有一个None,在这种情况下,根据我的经验,我的解决方案工作得很好。是的,填充批次没有维度,因此我必须获得其动态形状以便进一步工作。我使用tf.function切换到图形模式,问题是我不知道如何在tf.function下得到动态形状。