Заполнитель Tensorflow из функции

1

Я хочу сделать что-то вроде этого:

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

Но у кого-то есть лучшее решение для этого. Как создать внутреннюю функцию заполнителя и значение подачи для него снаружи, когда функция вызывается и ее возвращаемое значение передается как оператор для запуска функции, как в примере выше.

Теги:
tensorflow

2 ответа

1

Вы можете получить доступ к заполнителю по его названию:

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'.)

  • 0
    Большое спасибо !!!
  • 0
    Но у меня есть одна проблема, если я снова запускаю этот код jupyter notebook, у меня есть эта ошибка: ** InvalidArgumentError: Вы должны передать значение для тензора заполнителя 'place_1' с помощью dtype int32 [[Node: place_1 = Placeholder [dtype = DT_INT32, shape = <unknown>, _device = "/ job: localhost / replica: 0 / task: 0 / device: CPU: 0"] ()]] `**
1

Это чисто Python, но вы можете просто вернуть placeholder вместе с созданным им графиком op.

Как это:

return place*2, place

И затем используйте f() следующим образом:

y, place = f()

Я думаю, что это хорошая идея работать в классе в Tensorflow и иметь возможность легко обращаться к этим заполнителям.

Изменение: Конечно, всегда можно дать своему заполнителю имя, а затем извлечь его из графика, когда вам нужно его кормить.

  • 1
    Большое спасибо !!!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню