wake-up-neo.net

Rufen Sie in Tensorflow die Namen aller Tensoren in einem Diagramm ab

Ich erschaffe neuronale Netze mit Tensorflow und skflow; Aus irgendeinem Grund möchte ich die Werte einiger innerer Tensoren für eine gegebene Eingabe abrufen, daher verwende ich myClassifier.get_layer_value(input, "tensorName"), myClassifier, die einen skflow.estimators.TensorFlowEstimator ist. 

Ich finde es jedoch schwierig, die richtige Syntax des Tensornamens zu finden, selbst wenn ich dessen Namen kenne (und ich werde zwischen Operation und Tensoren verwirrt). Deshalb benutze ich Tensorboard, um den Graphen zu zeichnen und den Namen zu suchen.

Gibt es eine Möglichkeit, alle Tensoren in einem Graphen ohne Tensorboard aufzulisten?

72
P. Camilleri

Du kannst tun

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

Wenn Sie Prototyping in einem IPython-Notebook durchführen, können Sie das Diagramm direkt im Notebook anzeigen. Siehe show_graph-Funktion in Alexanders Deep Dream notebook

137

Es gibt einen Weg, dies etwas schneller als in Yaroslavs Antwort zu tun, indem Sie get_operations verwenden. Hier ein kurzes Beispiel:

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))
19
Salvador Dali

tf.all_variables() kann Ihnen die gewünschten Informationen liefern.

Außerdem hat dieses Commit heute in TensorFlow Learn vorgenommen, dass eine Funktion get_variable_names im Schätzer enthält, mit der Sie alle Variablennamen problemlos abrufen können. 

9
Yuan Tang

Die akzeptierte Antwort enthält nur eine Liste von Zeichenfolgen mit den Namen. Ich bevorzuge einen anderen Ansatz, der Ihnen (fast) direkten Zugang zu den Tensoren gibt:

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

list_of_tuples enthält jetzt jeden Tensor, jeder innerhalb eines Tupels. Sie können es auch anpassen, um die Tensoren direkt zu erhalten:

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

Ich denke, das wird auch so sein:

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

Aber im Vergleich zu den Antworten von Salvado und Yaroslav weiß ich nicht, welche besser ist.

3
Lu Howyou

Vorherige Antworten sind gut, ich möchte nur eine von mir geschriebene Utility-Funktion zur Auswahl von Tensoren aus einem Diagramm teilen:

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

Wenn Sie also eine Grafik mit Ops haben:

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

Dann rennen 

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

kehrt zurück:

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

Ich werde versuchen, die Antworten zusammenzufassen:

m alle Knoten zu erhalten:

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

Diese haben den Typ tensorflow.core.framework.node_def_pb2.NodeDef

m alle Operationen zu erhalten:

all_ops = tf.get_default_graph().get_operations()

Diese haben den Typ tensorflow.python.framework.ops.Operation

m alle Variablen zu erhalten:

all_vars = tf.global_variables()

Diese haben den Typ tensorflow.python.ops.resource_variable_ops.ResourceVariable

Und schließlich, um die Frage zu beantworten, m alle Tensoren zu erhalten:

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

Diese haben den Typ tensorflow.python.framework.ops.Tensor

1
Szabolcs

Da das OP nicht nach der Liste der Operationen/Knoten nach der Liste der Tensoren gefragt hat, sollte der Code etwas anders sein:

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]
0
gebbissimo

Das hat für mich funktioniert:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
0