ted
ted

Reputation: 14744

Check if node is an operation or a tensor in Tensorflow Graph

Using names = [n.name for n in graph.as_graph_def().node] I can get all the node names in the graph.

For instance, say this prints:

['model/classifier/dense/kernel/Initializer/random_uniform/shape',
'model/classifier/dense/kernel/Initializer/random_uniform/min',
'model/classifier/dense/kernel/Initializer/random_uniform/max',
'model/classifier/dense/kernel/Initializer/random_uniform/RandomUniform',
'model/classifier/dense/kernel/Initializer/random_uniform/sub',
'model/classifier/dense/kernel/Initializer/random_uniform/mul',
'model/classifier/dense/kernel/Initializer/random_uniform',
'model/classifier/dense/kernel',
'model/classifier/dense/kernel/Assign',
'model/classifier/dense/kernel/read',
'model/classifier/dense/bias/Initializer/zeros/shape_as_tensor',
'model/classifier/dense/bias/Initializer/zeros/Const',
'model/classifier/dense/bias/Initializer/zeros',
'model/classifier/dense/bias',
'model/classifier/dense/bias/Assign',
'model/classifier/dense/bias/read',
'model/classifier/dense/MatMul',
'model/classifier/dense/BiasAdd'] 

How can I select only the operations or only the tensors?

I'm aware of the following workarounds, which will work in specific situations but are not general enough and would not scale to a large graph:

Upvotes: 2

Views: 2845

Answers (3)

ted
ted

Reputation: 14744

Ok I found the answer. It lied mainly in that what I was really looking for are Variables not just regular Tensors.

Therefore it's as easy as:

with graph.as_default():
    kernel = [v for v in tf.global_variables()
        if 'optimization' not in v.name and
        'classifier' in v.name
        and 'kernel' in v.name
    ][0]

Upvotes: 1

T. Kelher
T. Kelher

Reputation: 1186

if you want a better feel of operations and nodes, try running tensorboard. You can write summary files with tf.summary.FileWriter("folder_name", sess.graph).

My tensorflow knowledge is limited but I think that tensor names and operator names are almost the same. An operator can have multiple outputs, and each of these outputs is called a tensor. The tensor name is therefore just operator_name:output_index, the output_index is often 0, since most operators have a single output. So give running sess.graph.get_tensor_by_name("model/classifier/dense/kernel/Initializer/random_uniform/mul:0") a chance. I'm not sure if having such long names is practical though.

Sorry if the provided information is not 100% correct, I'm just a beginner.

Upvotes: 1

bountrisv
bountrisv

Reputation: 55

You can use the isinstance(item, class) and compare the nodes with the tf.Operation class like so [n.name for n in graph.as_graph_def().node if isinstance(n, tf.Operation)]

Upvotes: -1

Related Questions