遍历tf.tensor不允许:此功能禁用了AutoGraph

时间:2020-05-28 15:19:55

标签: python tensorflow

我正在使用tensorflow 2.1和python 3.7

以下代码段用于构建张量流图。作为独立的python脚本执行时,代码运行无错误。 (可能是tensorflow在急切模式下运行?我不确定。)

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装饰的含义。我还检查了在tensorflow图中使用python列表理解可能是一个问题。我不确定在我的情况下如何使用tf.map_fntf.while_loop,因为我有嵌套循环。

谢谢!

2 个答案:

答案 0 :(得分:4)

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

在不理解之前,您必须使用map_fn,在这种情况下,它将类似于以下内容:

app-from-builder-components-editor

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

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)

答案 1 :(得分:1)

这自然适用于 tf 版本:2.5.0。现在你可以直接使用嵌套的推导式了。