RuntimeError:tf.placeholder()与急切执行不兼容

时间:2019-06-12 11:58:43

标签: python python-3.x tensorflow tensorflow2.0

我已将tf_upgrade_v2 TF1代码升级为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))

您能给我一些有关如何进行的建议吗?任何“快速”解决方案?还是应该重新编码?

4 个答案:

答案 0 :(得分:4)

如果在使用TensorFlow模型进行对象检测时遇到此错误,请使用exporter_main_v2.py而非export_inference_graph.py来导出模型。这是正确的方法。如果您只是关闭eager_execution,它将解决此错误,但会生成其他错误。

还请注意,有一些参数更改,例如,您将指定检查点目录的路径而不是检查点的路径。请参阅this文档,以了解如何使用TensorFlow V2进行对象检测

答案 1 :(得分:2)

在TensorFlow 1.X中,创建了占位符,并打算在实例化tf.Session时将其馈入实际值。但是,从TensorFlow2.0起,默认情况下已启用Eager Execution,因此“占位符”的概念没有意义,因为操作是立即进行计算的(而不是与旧的范例有所不同)。

另请参见Functions, not Sessions

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

答案 2 :(得分:0)

tf.placeholder()旨在被馈送到会话,该会话在运行时从feed dict接收值并执行所需的操作。 通常,您将使用'with'关键字创建一个Session()并运行它,但这可能并不适合所有需要立即执行的情况,这被称为渴望执行。 示例:

通常,这是运行会话的过程:

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,并且tf.compat.v1.placeholder中存在占位符,但这只能在急切模式下执行。

tf.compat.v1.disable_eager_execution()

TensorFlow释放了渴望的执行模式,对于该模式,定义后立即执行每个节点。因此,使用tf.placeholder的语句不再有效。

答案 3 :(得分:0)

我在这里找到了一个简单的解决方案:disable Tensorflow eager execution

基本上是:

tf.compat.v1.disable_eager_execution()

通过此操作,您可以禁用默认的激活急切执行功能,而无需过多地触摸代码。