Tensorflow में, एक ग्राफ में सभी Tensors के नाम प्राप्त करें


118

मैं के साथ तंत्रिका जाल बना रहा हूँ Tensorflowऔर skflow; किसी कारण से मैं किसी दिए गए इनपुट के लिए कुछ भीतरी tensors के मूल्यों को प्राप्त करना चाहते हैं, तो मैं उपयोग कर रहा हूँ myClassifier.get_layer_value(input, "tensorName"), myClassifierएक जा रहा है skflow.estimators.TensorFlowEstimator

हालांकि, मुझे टेंसर नाम का सही सिंटैक्स ढूंढना मुश्किल है, यहां तक ​​कि इसके नाम को जानना भी (और मैं ऑपरेशन और टेनर्स के बीच भ्रमित हो रहा हूं), इसलिए मैं ग्राफ को प्लॉट करने और नाम की तलाश करने के लिए टेंसबोर्ड का उपयोग कर रहा हूं।

वहाँ एक ग्राफ़ में सभी टेंसरों की गणना करने का एक तरीका है बिना टैंसबोर्ड का उपयोग किए बिना?

जवाबों:


189

तुम कर सकते हो

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

इसके अलावा, यदि आप एक IPython नोटबुक में प्रोटोटाइप कर रहे हैं, तो आप ग्राफ़ को सीधे नोटबुक में दिखा सकते हैं, show_graphअलेक्जेंडर के डीप नोटबुक में फ़ंक्शन देखें


2
आप इसे समझ सकते हैं उदाहरण if "Variable" in n.opके लिए समझ के अंत में जोड़कर चर ।
राडू

क्या कोई विशिष्ट नोड प्राप्त करने का एक तरीका है यदि आप नाम जानते हैं?
रॉकेट पिंगू

ग्राफ़ नोड्स के बारे में और अधिक पढ़ने के लिए: Tenorflow.org/extend/tool_developers/#nodes
इवान

3
ऊपर दिया गया कमांड सभी ऑपरेशन / नोड्स के नाम देता है। सभी टेनसरों के नाम प्राप्त करने के लिए, करें: tanors_per_node = [node.values ​​() graph.get_operations () में नोड के लिए टेनॉर_नमेज़ = [टेंसर्स में टेनर्स के लिए torsors_name = टेंसरों में टेनर्स के लिए _node]
gebbissimo

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

1
आप का उपयोग कर सेंसर नहीं मिल सकता है tf.get_operations()। केवल ऑपरेशन आप प्राप्त कर सकते हैं।
सिल्डक

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
यह केवल वैरिएबल लाती है, न कि टेंसर्स।
राजर्षि मित्र

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

लेकिन सलवाडो और यारोस्लाव के जवाबों की तुलना में, मुझे नहीं पता कि कौन सा बेहतर है।


यह एक टेंसोफ़्लो ऑब्जेक्ट डिटेक्शन एपीआई में उपयोग की जाने वाली एक जमे हुए_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

चूंकि ओपी ने ऑपरेशनों / नोड्स की सूची के बजाय टेंसरों की सूची मांगी है, इसलिए कोड थोड़ा अलग होना चाहिए:

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

पिछले उत्तर अच्छे हैं, मैं एक उपयोगिता फ़ंक्शन को साझा करना चाहूंगा, जिसे मैंने एक ग्राफ से टेंसर का चयन करने के लिए लिखा था:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.