Я хочу сделать что-то вроде этого:
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 })
Конечно, место закладок не видно снаружи.
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
И я могу решить это, таким образом:
def f():
global place
place = tf.placeholder(tf.int32)
return 2 * place
Но у кого-то есть лучшее решение для этого. Как создать внутреннюю функцию заполнителя и значение подачи для него снаружи, когда функция вызывается и ее возвращаемое значение передается как оператор для запуска функции, как в примере выше.
Вы можете получить доступ к заполнителю по его названию:
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 })
Всякий раз, когда вы определяете placeholder (или любой другой тензор TensorFlow или операцию), он добавляется к вычислительному графу, который является объектом, который находится в фоновом режиме и управляет всеми вычислениями. Каждый заполнитель имеет имя по умолчанию, но вы также можете выбрать имя для него. В этом примере я выбрал place
имени.
Теперь, для расширенных вариантов использования, у вас может быть более одного вычислительного графика, но всегда есть тот, который является стандартным. Чтобы получить значение по умолчанию, я использовал tf.get_default_graph()
. И затем, чтобы получить ссылку на местозаполнитель, я использовал get_tensor_by_name('place:0')
. (Я использовал имя 'place:0'
вместо 'place'
потому что, когда вы определяете местозаполнитель, на самом деле создается tf.Tensor
который вы можете кормить, а также создается операция, которая выполняет подачу. имя 'place'
тогда как фактический тензор будет иметь имя 'place:0'
.)
Это чисто Python, но вы можете просто вернуть placeholder вместе с созданным им графиком op.
Как это:
return place*2, place
И затем используйте f() следующим образом:
y, place = f()
Я думаю, что это хорошая идея работать в классе в Tensorflow и иметь возможность легко обращаться к этим заполнителям.
Изменение: Конечно, всегда можно дать своему заполнителю имя, а затем извлечь его из графика, когда вам нужно его кормить.