Итерация по tf.Tensor не разрешена: AutoGraph в этой функции отключен - PullRequest
0 голосов
/ 28 мая 2020

Я использую 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])]

Однако код не работает, когда это часть графа тензорного потока. Я получаю следующую ошибку: tensorflow.

python .framework.errors_impl.OperatorNotAllowedInGraphError: повторение tf.Tensor не разрешено: AutoGraph отключен в этой функции. Попробуйте украсить его напрямую с помощью @ tf.function.

Я также добавил декоратор @tf.function к методу, который обертывает приведенные выше строки кода. Это не помогло. Я не уверен, что полностью понимаю значение украшения @tf.function. Я также проверил, что это может быть проблемой при использовании понимания списка python внутри графа тензорного потока. Я не уверен, как использовать tf.map_fn или tf. while_l oop для моего случая, поскольку у меня есть вложенные циклы.

Заранее спасибо!

1 Ответ

1 голос
/ 28 мая 2020

Списки в автографах пока не поддерживаются. Выявленную ошибку тоже необходимо исправить. Накопление на 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)
...