Python 函数中的Tensorflow占位符

Python 函数中的Tensorflow占位符,python,tensorflow,Python,Tensorflow,我想这样做: def f(): place = tf.placeholder(tf.int32) return 2 * place y = f() with tf.Session() as sess: a = sess.run(y, feed_dict={ place: 5 }) y, place = f() 当然,占位符位置在外部不可见 NameError Traceback (most recen

我想这样做:

def f():
    place = tf.placeholder(tf.int32)
    return 2 * place

y = f()

with tf.Session() as sess:
    a = sess.run(y, feed_dict={ place: 5 })
y, place = f()
当然,占位符位置在外部不可见

NameError                                 Traceback (most recent call last)
<ipython-input-88-8b3c17d16dce> in <module>()
      1 with tf.Session() as sess:
----> 2     a = sess.run(y, feed_dict={ place: 5 })

NameError: name 'place' is not defined

但是,有谁有更好的解决方案吗。如何在函数内部创建占位符,并在函数被调用时将值提供给函数外部,其返回值作为操作符传递给运行函数,如上面的示例所示

这纯粹是Python,但您只需将占位符与使用它创建的图形op一起返回即可

像这样:

return place*2, place
然后像这样使用f():

def f():
    place = tf.placeholder(tf.int32)
    return 2 * place

y = f()

with tf.Session() as sess:
    a = sess.run(y, feed_dict={ place: 5 })
y, place = f()
我认为在Tensorflow中的一个类中工作是一个好主意,并且能够在任何地方轻松访问这些占位符


编辑:当然,始终可以为占位符指定一个名称,然后在需要输入占位符时从图形中获取占位符。

这纯粹是Python,但您只需将占位符与用它创建的图形op一起返回即可

像这样:

return place*2, place
然后像这样使用f():

def f():
    place = tf.placeholder(tf.int32)
    return 2 * place

y = f()

with tf.Session() as sess:
    a = sess.run(y, feed_dict={ place: 5 })
y, place = f()
我认为在Tensorflow中的一个类中工作是一个好主意,并且能够在任何地方轻松访问这些占位符


编辑:当然,始终可以为占位符命名,然后在需要输入占位符时从图形中获取它。

您可以通过名称访问占位符:

import tensorflow as tf

def f():
    place = tf.placeholder(tf.int32,name='place')
    return 2 * place

y = f()

with tf.Session() as sess:
    place = tf.get_default_graph().get_tensor_by_name('place:0')
    a = sess.run(y, feed_dict={ place: 5 })
解释 无论何时定义占位符(或任何其他TensorFlow tensor或操作),它都会添加到计算图中,计算图是一个位于后台并管理所有计算的对象。每个占位符都有一个默认名称,但您也可以为其选择一个名称。在本例中,我选择了名称
place


现在,对于高级用例,您可能有多个计算图,但总有一个是默认的。为了获得默认值,我使用了
tf.get\u default\u graph()
。然后,为了获得对占位符的引用,我使用了
get\u tensor\u by\u name('place:0')
。(我使用名称
'place:0'
而不是
'place'
,因为在定义占位符时,实际上创建了一个可以馈送的
tf.Tensor
,并且还创建了一个执行馈送的操作。该操作将具有名称
'place'
,而实际的张量将具有名称
'place:0'

您可以通过名称访问占位符:

import tensorflow as tf

def f():
    place = tf.placeholder(tf.int32,name='place')
    return 2 * place

y = f()

with tf.Session() as sess:
    place = tf.get_default_graph().get_tensor_by_name('place:0')
    a = sess.run(y, feed_dict={ place: 5 })
解释 无论何时定义占位符(或任何其他TensorFlow tensor或操作),它都会添加到计算图中,计算图是一个位于后台并管理所有计算的对象。每个占位符都有一个默认名称,但您也可以为其选择一个名称。在本例中,我选择了名称
place


现在,对于高级用例,您可能有多个计算图,但总有一个是默认的。为了获得默认值,我使用了
tf.get\u default\u graph()
。然后,为了获得对占位符的引用,我使用了
get\u tensor\u by\u name('place:0')
。(我使用名称
'place:0'
而不是
'place'
,因为在定义占位符时,实际上创建了一个可以馈送的
tf.Tensor
,并且还创建了一个执行馈送的操作。该操作将具有名称
'place'
,而实际的张量将具有名称
'place:0'

但是,如果我再次运行此代码,我有一个问题jupyter notebook,我有一个错误:*InvalidArgumentError:您必须为占位符张量“place\u 1”输入一个值,该值的数据类型为int32[[Node:place\u 1=placeholder[dtype=DT\u int32,shape=,\u device=“/job:localhost/replica:0/task:0/device:CPU:0”]()]`**,如果我再次运行此代码,jupyter notebook会有一个问题,我有一个错误:*InvalidArgumentError:您必须使用dtype int32[[Node:place_1=placeholder[dtype=DT_int32,shape=,\u device=“/job:localhost/replica:0/task:0/device:CPU:0”]()]`**