I'm having trouble recovering a tensor by name, I don't even know if it's possible.
I have a function that creates my graph:
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
I want to access the variable S1_conv1 outside this function. I tried:
with tf.variable_scope('scale_1') as scope_conv: tf.get_variable_scope().reuse_variables() ft=tf.get_variable('Scale1_first_relu')
But that is giving me an error:
ValueError: Under-sharing: Variable scale_1/Scale1_first_relu does not exist, disallowed. Did you mean to set reuse=None in VarScope?
But this works:
with tf.variable_scope('scale_1') as scope_conv: tf.get_variable_scope().reuse_variables() ft=tf.get_variable('W_S1_conv1')
I can get around this with
return S3_conv1,regularizer, S1_conv1
but I don't want to do that.
I think my problem is that S1_conv1 is not really a variable, it's just a tensor. Is there a way to do what I want?
The easiest[A] way to evaluate the actual value of a Tensor object is to pass it to the Session. run() method, or call Tensor. eval() when you have a default session (i.e. in a with tf. Session(): block, or see below).
We can access the data type of a tensor using the ". dtype" attribute of the tensor. It returns the data type of the tensor.
Learn about Tensors, the multi-dimensional arrays used by TensorFlow. Tensors are multi-dimensional arrays with a uniform type (called a dtype ).
There is a function tf.Graph.get_tensor_by_name(). For instance:
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)
All tensors have string names which you can see as follows
[tensor.name for tensor in tf.get_default_graph().as_graph_def().node]
Once you know the name you can fetch the Tensor using <name>:0
(0 refers to endpoint which is somewhat redundant)
For instance if you do this
tf.constant(1)+tf.constant(2)
You have the following Tensor names
[u'Const', u'Const_1', u'add']
So you can fetch output of addition as
sess.run('add:0')
Note, this is part not part of public API. Automatically generated string tensor names are an implementation detail and may change.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With