Подтвердить что ты не робот

Тензор: Как получить тензор по имени?

У меня возникают проблемы с восстановлением тензора по имени, я даже не знаю, возможно ли это.

У меня есть функция, которая создает мой график:

def create_structure(tf, x, input_size,dropout):    
 with tf.variable_scope("scale_1") as scope:
  W_S1_conv1 = deep_dive.weight_variable_scaling([7,7,3,64], name='W_S1_conv1')
  b_S1_conv1 = deep_dive.bias_variable([64])
  S1_conv1 = tf.nn.relu(deep_dive.conv2d(x_image, W_S1_conv1,strides=[1, 2, 2, 1], padding='SAME') + b_S1_conv1, name="Scale1_first_relu")
.
.
.
return S3_conv1,regularizer

Я хочу получить доступ к переменной S1_conv1 вне этой функции. Я пробовал:

with tf.variable_scope('scale_1') as scope_conv: 
 tf.get_variable_scope().reuse_variables()
 ft=tf.get_variable('Scale1_first_relu')

Но это дает мне ошибку:

ValueError: Недопустимое разделение: переменная scale_1/Scale1_first_relu не существует, запрещена. Вы хотели установить reuse = None в VarScope?

Но это работает:

with tf.variable_scope('scale_1') as scope_conv: 
 tf.get_variable_scope().reuse_variables()
 ft=tf.get_variable('W_S1_conv1')

Я могу обойти это с помощью

return S3_conv1,regularizer, S1_conv1

но я не хочу этого делать.

Я думаю, моя проблема в том, что S1_conv1 на самом деле не является переменной, это просто тензор. Есть ли способ сделать то, что я хочу?

4b9b3361

Ответ 1

Существует функция 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)

Ответ 2

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

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

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

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

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

У вас есть следующие имена Tensor

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

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

sess.run('add:0')

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