迭代 tf.不允许张量:此函数中禁用了自动签名



我正在使用tensorflow 2.1和python 3.7

以下代码片段用于构建张量流图。代码在作为独立的 python 脚本执行时运行时没有错误。(可能张量流正在以渴望模式运行?我不确定。

import tensorflow as tf
patches = tf.random.uniform(shape=(1, 10, 50, 300), dtype=tf.dtypes.float32)
s = tf.shape(patches)
patches = [patches[0][x][y] - tf.reduce_mean(patches[0][x][y]) for y in tf.range(s[2]) for x in tf.range(s[1])]

但是,当这是张量流图的一部分时,代码会失败。我收到以下错误: 张量流。

python.framework.errors_impl。OperatorNotAllowedInGraphError: 迭代 不允许超过tf.Tensor:此函数禁用自动图。尝试直接使用 @tf.function 装饰它。

我还在包装上述代码行的方法中添加了装饰器@tf.function。它没有帮助。我不确定我是否完全理解用@tf.function装饰的含义.我还检查了这可能是在张量流图中使用 python 列表理解的问题。我不确定如何在我的情况下使用 tf.map_fn 或 tf.while_loop,因为我有嵌套循环。

提前感谢!

签名中尚不支持列表推导式。引发的错误也需要改进。堆积 https://github.com/tensorflow/tensorflow/issues/32546 应该有助于更快地解决它。

在支持推导之前,您必须使用 map_fn,在本例中如下所示:

def outer_comp(x):
def inner_comp(y):
return patches[0][x][y] - tf.reduce_mean(patches[0][x][y])
return tf.map_fn(inner_comp, tf.range(s[2]), dtype=tf.float32)
patches = tf.map_fn(outer_comp, tf.range(s[1]), dtype=tf.float32)

也就是说,我相信你可以直接使用reduce_mean:

patches = patches - tf.expand_dims(tf.reduce_mean(patches, axis=3), -1)

这在 tf 版本中自然有效:2.5.0。现在,您可以直接使用嵌套推导式。

相关内容

最新更新