RuntimeError: tf.placeholder () несовместим с нетерпеливым выполнением

Я обновил код TF1 с tf_upgrade_v2 до TF2. Я новичок с обоими. У меня следующая ошибка:

RuntimeError: tf.placeholder() is not compatible with eager execution.

У меня есть tf.compat.v1.placeholder().

self.temperature = tf.compat.v1.placeholder_with_default(1., shape=())
self.edges_labels = tf.compat.v1.placeholder(dtype=tf.int64, shape=(None, vertexes, vertexes))
self.nodes_labels = tf.compat.v1.placeholder(dtype=tf.int64, shape=(None, vertexes))
self.embeddings = tf.compat.v1.placeholder(dtype=tf.float32, shape=(None, embedding_dim))

Не могли бы вы дать мне совет, как действовать дальше? Какие-нибудь «быстрые» решения? или я должен это перекодировать?


person AMGMNPLK    schedule 12.06.2019    source источник


Ответы (4)


Я нашел здесь простое решение: отключить активное выполнение Tensorflow

В основном это:

tf.compat.v1.disable_eager_execution()

Таким образом, вы отключаете активированное по умолчанию активное выполнение, и вам больше не нужно прикасаться к коду.

person AMGMNPLK    schedule 12.06.2019
comment
Я не думаю, что это отличная идея, потому что вы теряете возможность легко чередовать код python и tensorflow - вы сильно ограничены с точки зрения выразительности и с таким же успехом можете использовать TF 1.X. Если вы хотите скомпилировать операции в компоненты графа, не теряя при этом активного выполнения, вы можете украсить функции с помощью tf.function, который выполняет JIT-компиляцию кода в граф. - person cs95; 13.06.2019
comment
Где мы используем этот метод? Вместо каждого tf.compat.v1.placeholder ()? - person ; 03.06.2020
comment
В начале использования ТФ или скрипта. - person AMGMNPLK; 03.06.2020
comment
Пытаюсь запустить какой-нибудь старый код Tensorflow, и кажется, что половина библиотеки устарела. - person gwg; 09.10.2020
comment
@AMGMNPLK tf.compat.v1.disable_eager_execution(), спасибо ~ - person RYO ENG Lian Hu; 24.05.2021

tf.placeholder () предназначен для передачи в сеанс, который при запуске получает значения из потока dict и выполняет требуемую операцию. Как правило, вы должны создать Session () с ключевым словом with и запустить его. Но это может не благоприятствовать всем ситуациям, из-за которых вам потребуется немедленное выполнение. Это называется нетерпеливым исполнением. Пример:

как правило, это процедура для запуска сеанса:

import tensorflow as tf

def square(num):
    return tf.square(num) 

p = tf.placeholder(tf.float32)
q = square(num)

with tf.Session() as sess:
    print(sess.run(q, feed_dict={num: 10})

Но когда мы работаем с нетерпением, мы запускаем его как:

import tensorflow as tf

tf.enable_eager_execution()

def square(num):
   return tf.square(num)

print(square(10)) 

Поэтому нам не нужно явно запускать его внутри сеанса, и в большинстве случаев он может быть более интуитивным. Это обеспечивает более интерактивное выполнение. Для получения дополнительной информации посетите: https://www.tensorflow.org/guide/eager

Если вы конвертируете код из tensorflow v1 в tensorflow v2, вы должны реализовать tf.compat.v1 и Placeholder присутствует в tf.compat.v1.placeholder, но это можно выполнить только в выключенном режиме ожидания.

tf.compat.v1.disable_eager_execution()

TensorFlow выпустил режим активного выполнения, для которого каждый узел выполняется сразу после определения. Таким образом, утверждения, использующие tf.placeholder, больше не действительны.

person Ashish Bastola    schedule 12.06.2019
comment
Спасибо Ашиш. Да, я понимаю логику под нетерпением и сеансом, но я говорю об обновлении кода TF1 до TF2 с помощью инструмента ft_upgrade_v2. Разве это не заботится о заполнителях? - person AMGMNPLK; 12.06.2019
comment
Спасибо за разъяснение вашей проблемы! Похоже, что заполнители удалены из tensorflow2.0, и вам нужно создать тензор типа None. Также, если вы используете tf.compat.v1. *, Вам нужно отключить активное выполнение из-за несовместимости! - person Ashish Bastola; 12.06.2019
comment
tf.compat.v1.disable_eager_execution(), спасибо ~ - person RYO ENG Lian Hu; 24.05.2021

В TensorFlow 1.X заполнители создаются и предназначены для передачи фактических значений при создании экземпляра tf.Session. Однако начиная с TensorFlow2.0 и далее Eager Execution был включен по умолчанию, поэтому понятие "заполнитель" не имеет смысла, поскольку операции вычисляются немедленно (а не отличаются от старой парадигмы).

См. Также Функции, а не сеансы,

# TensorFlow 1.X
outputs = session.run(f(placeholder), feed_dict={placeholder: input})
# TensorFlow 2.0
outputs = f(input)
person cs95    schedule 12.06.2019

Если вы получаете эту ошибку при обнаружении объектов с использованием модели TensorFlow, используйте exporter_main_v2.py вместо export_inference_graph.py для экспорта модели. Это правильный метод. Если вы просто отключите eager_execution, он устранит эту ошибку, но сгенерирует другую.

Также обратите внимание, что есть некоторые изменения параметров, например, вы указываете путь к каталогу контрольной точки вместо пути к контрольной точке. обратитесь к этому документ о том, как выполнять обнаружение объектов с помощью TensorFlow V2

person Vishvajeet Ramanuj    schedule 18.09.2020