Tensorflow에서 그래프의 모든 Tensor 이름을 가져옵니다.


118

저는 Tensorflow및로 신경망을 만들고 있습니다 skflow. 어떤 이유로 그래서 내가 사용하고, 주어진 입력에 대한 몇 가지 내부 텐서의 값을 얻으려면 myClassifier.get_layer_value(input, "tensorName"), myClassifierskflow.estimators.TensorFlowEstimator.

그러나 이름을 알더라도 텐서 이름의 올바른 구문을 찾기가 어렵 기 때문에 (그리고 연산과 텐서 사이에 혼란스러워집니다) 그래프를 플로팅하고 이름을 찾기 위해 텐서 보드를 사용하고 있습니다.

텐서 보드를 사용하지 않고 그래프의 모든 텐서를 열거하는 방법이 있습니까?

답변:


189

넌 할 수있어

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

또한 IPython 노트북에서 프로토 타이핑하는 경우 노트북에 직접 그래프를 표시 할 수 있습니다 show_graph. Alexander 's Deep Dream 노트북 의 기능을 참조하십시오.


2
if "Variable" in n.op이해력 끝에 추가하여 변수를 필터링 할 수 있습니다 .
Radu

이름을 알고 있다면 특정 노드를 얻는 방법이 있습니까?
Rocket Pingu

그래프 노드에 대한 자세한 읽으려면 : tensorflow.org/extend/tool_developers/#nodes을
이반 Talalaev에게

3
위의 명령은 모든 작업 / 노드의 이름을 산출합니다. 모든 텐서의 이름을 얻으려면 다음을 수행하십시오. tensors_per_node = [node.values ​​() for node in graph.get_operations ()] tensor_names = [tensor.name for tensors_per_node for tensor in tensor]
gebbissimo

24

get_operations 를 사용하여 Yaroslav의 답변보다 약간 더 빠르게 수행하는 방법이 있습니다 . 다음은 간단한 예입니다.

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

2
.NET을 사용하여 Tensor를 가져올 수 없습니다 tf.get_operations(). 당신이 얻을 수있는 유일한 작업.
Soulduck

14

대답을 요약하려고합니다.

모든 노드 를 가져 오려면 (유형 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()]

11

tf.all_variables() 원하는 정보를 얻을 수 있습니다.

또한 오늘 TensorFlow Learn에서 만든 이 커밋get_variable_names모든 변수 이름을 쉽게 검색하는 데 사용할 수있는 추정기 의 기능을 제공합니다 .


이 기능은 지원되지 않습니다
CAFEBABE

8
... 그리고 그 후계자는tf.global_variables()
bluenote10

11
이것은 텐서가 아닌 변수 만 가져옵니다.
Rajarshee Mitra

Tensorflow 1.9.0에서 다음을 보여줍니다all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC

5

나는 이것도 할 것이라고 생각한다.

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

그러나 Salvado와 Yaroslav의 답변과 비교할 때 어느 것이 더 나은지 모르겠습니다.


이것은 tensorflow 객체 감지 API에서 사용되는 frozen_inference_graph.pb 파일에서 가져온 그래프로 작업했습니다. 감사합니다
simo23

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

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]

3

이전 답변이 좋았습니다. 그래프에서 Tensor를 선택하기 위해 작성한 유틸리티 함수를 공유하고 싶습니다.

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

따라서 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']

그런 다음 실행

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.