137

我正在用Tensorflowand创建神经网络skflow;出于某种原因,我想获取给定输入的一些内部张量的值,所以我使用myClassifier.get_layer_value(input, "tensorName"),myClassifier作为skflow.estimators.TensorFlowEstimator.

但是,我发现很难找到张量名称的正确语法,即使知道它的名称(而且我对操作和张量感到困惑),所以我使用 tensorboard 来绘制图形并查找名称。

有没有办法在不使用张量板的情况下枚举图中的所有张量?

4

10 回答 10

199

你可以做

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

此外,如果您在 IPython 笔记本中进行原型设计,您可以直接在笔记本中显示图形,请参阅show_graphAlexander 的 Deep Dream笔记本中的函数

于 2016-04-27T15:10:02.213 回答
35

我将尝试总结答案:

获取图中的所有节点:(类型tensorflow.core.framework.node_def_pb2.NodeDef

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

要获取图中的所有操作:(类型tensorflow.python.framework.ops.Operation

all_ops = tf.get_default_graph().get_operations()

要获取图表中的所有变量:(类型tensorflow.python.ops.resource_variable_ops.ResourceVariable

all_vars = tf.global_variables()

获取图中的所有张量:(类型tensorflow.python.framework.ops.Tensor

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

要获取图表中的所有占位符:(类型tensorflow.python.framework.ops.Tensor

all_placeholders = [placeholder for op in tf.get_default_graph().get_operations() if op.type=='Placeholder' for placeholder in op.values()]

张量流 2

要在 Tensorflow 2 中获取图形,tf.get_default_graph()您需要先实例化 atf.function并访问graph属性,例如:

graph = func.get_concrete_function().graph

哪里functf.function

于 2019-08-12T11:02:41.393 回答
25

有一种方法可以通过使用get_operations 比雅罗斯拉夫的回答稍微快一点。这是一个简单的例子:

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))
于 2017-05-03T06:22:38.390 回答
11

tf.all_variables()可以得到你想要的信息。

此外,今天在 TensorFlow Learn 中进行的此提交get_variable_names在估算器中提供了一个函数,您可以使用该函数轻松检索所有变量名称。

于 2016-04-28T21:47:45.733 回答
5

我认为这也可以:

print(tf.contrib.graph_editor.get_tensors(tf.get_default_graph()))

但与萨尔瓦多和雅罗斯拉夫的答案相比,我不知道哪个更好。

于 2018-03-02T00:53:40.800 回答
4

由于 OP 要求提供张量列表而不是操作/节点列表,因此代码应该略有不同:

graph = tf.get_default_graph()    
tensors_per_node = [node.values() for node in graph.get_operations()]
tensor_names = [tensor.name for tensors in tensors_per_node for tensor in tensors]
于 2019-01-21T14:38:18.900 回答
4

接受的答案只为您提供带有名称的字符串列表。我更喜欢一种不同的方法,它可以让你(几乎)直接访问张量:

graph = tf.get_default_graph()
list_of_tuples = [op.values() for op in graph.get_operations()]

list_of_tuples现在包含每个张量,每个张量都在一个元组中。您还可以对其进行调整以直接获取张量:

graph = tf.get_default_graph()
list_of_tuples = [op.values()[0] for op in graph.get_operations()]
于 2018-03-16T13:27:36.183 回答
3

以前的答案很好,我只想分享一个我写的从图表中选择张量的实用函数:

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)
        ]

因此,如果您有一个带有操作的图表:

['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']

然后运行

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

返回:

['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']
于 2018-05-15T09:06:00.047 回答
1

以下解决方案适用于 TensorFlow 2.3 -

def load_pb(path_to_pb):
    with tf.io.gfile.GFile(path_to_pb, 'rb') as f:
        graph_def = tf.compat.v1.GraphDef()
        graph_def.ParseFromString(f.read())
    with tf.Graph().as_default() as graph:
        tf.import_graph_def(graph_def, name='')
        return graph
tf_graph = load_pb(MODEL_FILE)
sess = tf.compat.v1.Session(graph=tf_graph)

# Show tensor names in graph
for op in tf_graph.get_operations():
    print(op.values())

MODEL_FILE冻结图的路径在哪里。

取自这里

于 2020-09-23T14:25:52.153 回答
0

这对我有用:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
于 2018-12-18T05:46:12.180 回答