Получить Тензор по идентичности? [Дубликат]

Во-первых, Windows (во всех ее воплощениях) является нестандартной ОС.

Linux (и большинство проприетарных unixen) являются стандартными операционными системами, совместимыми с POSIX.

The C библиотеки отражают эту дихотомию. Python отображает библиотеки C.

Для этого не существует «кросс-платформенного» способа. Вы должны взломать что-то с помощью ctypes для определенной версии Windows (XP или Vista)

38
задан protas 14 April 2016 в 01:56
поделиться

3 ответа

Существует функция tf.Graph.get_tensor_by_name (). Например:

import tensorflow as tf

c = tf.constant([[1.0, 2.0], [3.0, 4.0]])
d = tf.constant([[1.0, 1.0], [0.0, 1.0]])
e = tf.matmul(c, d, name='example')

with tf.Session() as sess:
    test =  sess.run(e)
    print e.name #example:0
    test = tf.get_default_graph().get_tensor_by_name("example:0")
    print test #Tensor("example:0", shape=(2, 2), dtype=float32)
45
ответ дан apfalz 18 August 2018 в 13:25
поделиться
  • 1
    Для справки, если вам нужно получить OP вместо тензора: stackoverflow.com/questions/42685994/… – David Parks 23 March 2017 в 21:08
  • 2
    @apfalz Как добраться до примера: 0 & quot; для имени тензора? – Bosen 4 July 2017 в 09:30
  • 3
    Не уверен, если я получу ваш вопрос, но в приведенном выше примере, если вы напечатаете e.name, вы знаете, что имя example:0. Tensorflow добавляет :0 к указанному вами имени. – apfalz 6 July 2017 в 14:20
  • 4
    Привет спасибо. Не могли бы вы рассказать мне, могу ли я использовать get_tensor_by_name, чтобы получить что-то, определенное tf.layers.dense, например means в этом примере кода здесь . – ytutow 26 August 2017 в 02:44
  • 5
    Я не знаю, как определение tf.variable_scopes внутри функций python усложняет вопросы, но вы можете попробовать использовать tf.get_collection(key, scope=None). В качестве альтернативы вы можете попробовать что-то вроде mean_vars = [i for i in tf.global_variables() if i.name.startswith('mean')] или потенциально mean_vars = [i for i in tf.global_variables() if 'mean' in i.name]. Я не тестировал второй, поэтому никаких обещаний. Это даст вам полное имя, как это понимает tensorflow. Оттуда tf.get_tensor_by_name() должен работать нормально. – apfalz 31 August 2017 в 16:22

Все тензоры имеют имена строк, которые вы можете видеть следующим образом

[tensor.name for tensor in tf.get_default_graph().as_graph_def().node]

Как только вы знаете имя, вы можете получить Тензор, используя <name>:0 (0 относится к конечной точке, которая несколько избыточна)

Например, если вы это сделаете

tf.constant(1)+tf.constant(2)

У вас есть следующие имена тензоров

[u'Const', u'Const_1', u'add']

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

sess.run('add:0')

Обратите внимание, что это часть, не входящая в открытый API. Автоматически созданные имена тензоров строковых объектов являются деталями реализации и могут меняться.

28
ответ дан Yaroslav Bulatov 18 August 2018 в 13:25
поделиться
  • 1
    Спасибо за помощь, но это не моя проблема. Мой тензор явно обозначен как «Scale1_first_relu», но я не могу получить ссылку на него вне функции, в которой он был объявлен. Однако я могу получить ссылку на переменную «W_S1_conv1». Являются ли тензоры локальными? Существуют ли они вне функции, где они созданы? – protas 14 April 2016 в 14:22
  • 2
    Тензоры существуют в графе. Если вы используете график по умолчанию, он разделяется между всеми функциями в одном потоке. Scale1_first_relu является скорее «предложением», а не фактическое имя. Это истинное имя в графе может иметь префикс, если он был создан внутри области или может иметь суффикс, автоматически добавленный для дедупликации. Просто напечатайте имя тензоров на графике, используя рецепт выше, и найдите тензоры, содержащие строку Scale1_first_relu – Yaroslav Bulatov 14 April 2016 в 16:56
  • 3
    Я уже это пробовал. Полное имя - «scale_1 \ Scale1_first_relu: 0». Поиск этого по-прежнему дает мне ошибку, но поиск «scale_1 \ W_S1_conv1» работает. Это похоже на то, что тензор больше не существует. – protas 14 April 2016 в 21:36
  • 4
    Если имя scale_1\Scale1_first_relu:0, вы можете получить его значение с помощью session.run('scale_1\Scale1_first_relu:0') – Yaroslav Bulatov 14 April 2016 в 23:36
  • 5
    Это не совсем то, что я хочу, и я даже не уверен, что это сработает, но спасибо за усилия. Мы нашли способ обойти это, оказалось, что возвращение S1_conv1 от функции не является проблемой. Прошу прощения, если вопрос был недостаточно ясным. – protas 15 April 2016 в 18:46
0
ответ дан Kislay Kunal 30 October 2018 в 04:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: