In Tensorflow, get the names of all the Tensors in a graph

前端 未结 10 649
独厮守ぢ
独厮守ぢ 2020-11-27 10:29

I am creating neural nets with Tensorflow and skflow; for some reason I want to get the values of some inner tensors for a given input, so I am usi

相关标签:
10条回答
  • 2020-11-27 10:45

    You can do

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

    Also, if you are prototyping in an IPython notebook, you can show the graph directly in notebook, see show_graph function in Alexander's Deep Dream notebook

    0 讨论(0)
  • 2020-11-27 10:51

    I'll try to summarize the answers:

    To get all nodes: (type tensorflow.core.framework.node_def_pb2.NodeDef)

    all_nodes = [n for n in tf.get_default_graph().as_graph_def().node]
    

    To get all ops: (type tensorflow.python.framework.ops.Operation)

    all_ops = tf.get_default_graph().get_operations()
    

    To get all variables: (type tensorflow.python.ops.resource_variable_ops.ResourceVariable)

    all_vars = tf.global_variables()
    

    To get all tensors: (type tensorflow.python.framework.ops.Tensor)

    all_tensors = [tensor for op in tf.get_default_graph().get_operations() for tensor in op.values()]
    

    To get the graph in Tensorflow 2, instead of tf.get_default_graph() you need to instantiate a tf.function first and access the graph attribute, for example:

    graph = func.get_concrete_function().graph
    

    where func is a tf.function

    0 讨论(0)
  • 2020-11-27 10:52

    There is a way to do it slightly faster than in Yaroslav's answer by using get_operations. Here is a quick example:

    import tensorflow as tf
    
    a = tf.constant(1.3, name='const_a')
    b = tf.Variable(3.1, name='variable_b')
    c = tf.add(a, b, name='addition')
    d = tf.multiply(c, a, name='multiply')
    
    for op in tf.get_default_graph().get_operations():
        print(str(op.name))
    
    0 讨论(0)
  • 2020-11-27 10:56

    Previous answers are good, I'd just like to share a utility function I wrote to select Tensors from a graph:

    def get_graph_op(graph, and_conds=None, op='and', or_conds=None):
        """Selects nodes' names in the graph if:
        - The name contains all items in and_conds
        - OR/AND depending on op
        - The name contains any item in or_conds
    
        Condition starting with a "!" are negated.
        Returns all ops if no optional arguments is given.
    
        Args:
            graph (tf.Graph): The graph containing sought tensors
            and_conds (list(str)), optional): Defaults to None.
                "and" conditions
            op (str, optional): Defaults to 'and'. 
                How to link the and_conds and or_conds:
                with an 'and' or an 'or'
            or_conds (list(str), optional): Defaults to None.
                "or conditions"
    
        Returns:
            list(str): list of relevant tensor names
        """
        assert op in {'and', 'or'}
    
        if and_conds is None:
            and_conds = ['']
        if or_conds is None:
            or_conds = ['']
    
        node_names = [n.name for n in graph.as_graph_def().node]
    
        ands = {
            n for n in node_names
            if all(
                cond in n if '!' not in cond
                else cond[1:] not in n
                for cond in and_conds
            )}
    
        ors = {
            n for n in node_names
            if any(
                cond in n if '!' not in cond
                else cond[1:] not in n
                for cond in or_conds
            )}
    
        if op == 'and':
            return [
                n for n in node_names
                if n in ands.intersection(ors)
            ]
        elif op == 'or':
            return [
                n for n in node_names
                if n in ands.union(ors)
            ]
    

    So if you have a graph with ops:

    ['model/classifier/dense/kernel',
    'model/classifier/dense/kernel/Assign',
    'model/classifier/dense/kernel/read',
    'model/classifier/dense/bias',
    'model/classifier/dense/bias/Assign',
    'model/classifier/dense/bias/read',
    'model/classifier/dense/MatMul',
    'model/classifier/dense/BiasAdd',
    'model/classifier/ArgMax/dimension',
    'model/classifier/ArgMax']
    

    Then running

    get_graph_op(tf.get_default_graph(), ['dense', '!kernel'], 'or', ['Assign'])
    

    returns:

    ['model/classifier/dense/kernel/Assign',
    'model/classifier/dense/bias',
    'model/classifier/dense/bias/Assign',
    'model/classifier/dense/bias/read',
    'model/classifier/dense/MatMul',
    'model/classifier/dense/BiasAdd']
    
    0 讨论(0)
提交回复
热议问题