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

118

Ich erstelle neuronale Netze mit Tensorflowund skflow; aus irgendeinem Grund möchte ich die Werte einiger inneren Tensoren für eine Eingabe erhalten, so verwende ich myClassifier.get_layer_value(input, "tensorName"), myClassifierein Wesen skflow.estimators.TensorFlowEstimator.

Es fällt mir jedoch schwer, die richtige Syntax des Tensornamens zu finden, selbst wenn ich seinen Namen kenne (und ich werde zwischen Operation und Tensoren verwechselt). Daher verwende ich Tensorboard, um das Diagramm zu zeichnen und nach dem Namen zu suchen.

Gibt es eine Möglichkeit, alle Tensoren in einem Diagramm ohne Verwendung von Tensorboard aufzulisten?

P. Camilleri
quelle

Antworten:

189

Du kannst tun

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

Wenn Sie Prototypen in einem IPython-Notizbuch erstellen, können Sie das Diagramm auch direkt im Notizbuch anzeigen (siehe show_graphFunktion in Alexanders Deep Dream- Notizbuch)

Jaroslaw Bulatow
quelle
2
Sie können dies beispielsweise nach Variablen filtern, indem Sie if "Variable" in n.opam Ende des Verständnisses hinzufügen .
Radu
Gibt es eine Möglichkeit, einen bestimmten Knoten zu erhalten, wenn Sie den Namen kennen?
Rocket Pingu
Um mehr über Graphknoten zu erfahren
Ivan Talalaev
3
Der obige Befehl liefert die Namen aller Operationen / Knoten. Um die Namen aller Tensoren zu erhalten, gehen Sie wie folgt vor: tensors_per_node = [node.values ​​() für Knoten in graph.get_operations ()] tensor_names = [tensor.name für Tensoren in tensors_per_node für Tensor in Tensoren]
gebbissimo
25

Es gibt eine Möglichkeit, dies mit get_operations etwas schneller als in Jaroslaws Antwort zu tun . Hier ist 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))
Salvador Dali
quelle
1
Sie können Tensoren nicht verwenden tf.get_operations(). Nur Operation können Sie bekommen.
Soulduck
14

Ich werde versuchen, die Antworten zusammenzufassen:

So erhalten Sie alle Knoten (Typ tensorflow.core.framework.node_def_pb2.NodeDef):

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

So erhalten Sie alle Operationen (Typ tensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

So erhalten Sie alle Variablen (Typ tensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

So erhalten Sie alle Tensoren (Typ tensorflow.python.framework.ops.Tensor) :

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

tf.all_variables() Sie erhalten die gewünschten Informationen.

Auch commit dies heute in TensorFlow gemacht Erfahren Sie, dass eine Funktion bietet get_variable_namesin Schätzer , dass man leicht alle Variablennamen abrufen können.

Yuan Tang
quelle
Diese Funktion ist veraltet
CAFEBABE
8
... und sein Nachfolger isttf.global_variables()
bluenote10
11
Dies ruft nur Variablen ab, keine Tensoren.
Rajarshee Mitra
In Tensorflow zeigt 1.9.0, dassall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC
5

Ich denke, das wird auch reichen:

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

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

Lu Howyou
quelle
Dieser arbeitete mit einem Diagramm, das aus einer gefrorenen_inferenz_graph.pb-Datei importiert wurde, die in der Tensorflow-Objekterkennungs-API verwendet wurde. Danke
simo23
4

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 ermöglicht:

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

list_of_tuplesenthä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()]
Picard
quelle
Auf diese Weise können Sie die tatsächlichen Ausgangstensoren der Ops abrufen, nicht nur der Ops.
Szabolcs
4

Da das OP nach der Liste der Tensoren anstelle der Liste der Operationen / Knoten gefragt hat, sollte der Code geringfügig abweichen:

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]
gebbissimo
quelle
3

Frühere Antworten sind gut. Ich möchte nur eine Dienstprogrammfunktion teilen, die ich geschrieben habe, um Tensoren aus einem Diagramm auszuwählen:

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 ein Diagramm mit Operationen 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']
ted
quelle
0

Das hat bei mir funktioniert:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
Akshaya Natarajan
quelle