Dans Tensorflow, obtenez les noms de tous les tenseurs dans un graphique


118

Je crée des réseaux neuronaux avec Tensorflowetskflow ; pour une raison quelconque, je veux obtenir les valeurs de certains tenseurs internes pour une entrée donnée, donc j'utilise myClassifier.get_layer_value(input, "tensorName"), myClassifierétant un skflow.estimators.TensorFlowEstimator.

Cependant, j'ai du mal à trouver la syntaxe correcte du nom du tenseur, même en connaissant son nom (et je me trompe entre l'opération et les tenseurs), donc j'utilise Tensorboard pour tracer le graphique et chercher le nom.

Existe-t-il un moyen d'énumérer tous les tenseurs d'un graphe sans utiliser tensorboard?

Réponses:


189

Tu peux faire

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

De plus, si vous effectuez un prototypage dans un bloc-notes IPython, vous pouvez afficher le graphique directement dans le bloc-notes, voir show_graphfonction dans le bloc-notes Deep Dream d'Alexander


2
Vous pouvez filtrer cela pour par exemple des variables en ajoutant if "Variable" in n.opà la fin de la compréhension.
Radu

Existe-t-il un moyen d'obtenir un nœud spécifique si vous connaissez le nom?
Rocket Pingu

Pour en savoir plus sur les nœuds de graphe: tensorflow.org/extend/tool_developers/#nodes
Ivan Talalaev

3
La commande ci-dessus donne les noms de toutes les opérations / nœuds. Pour obtenir les noms de tous les tenseurs, faites: 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

24

Il existe un moyen de le faire un peu plus rapidement que dans la réponse de Yaroslav en utilisant get_operations . Voici un exemple rapide:

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
Vous ne pouvez pas utiliser Tensors tf.get_operations(). Seule opération que vous pouvez obtenir.
Soulduck

14

Je vais essayer de résumer les réponses:

Pour obtenir tous les nœuds (type tensorflow.core.framework.node_def_pb2.NodeDef):

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

Pour obtenir toutes les opérations (type tensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

Pour obtenir toutes les variables (type tensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

Pour obtenir tous les tenseurs (type 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() peut vous fournir les informations que vous souhaitez.

Aussi, ce commit fait aujourd'hui dans TensorFlow Learn qui fournit une fonction get_variable_namesdans l'estimateur que vous pouvez utiliser pour récupérer facilement tous les noms de variables.


Cette fonction est obsolète
CAFEBABE

8
... et son successeur esttf.global_variables()
bluenote10

11
cela ne récupère que des variables, pas des tenseurs.
Rajarshee Mitra

Dans Tensorflow 1.9.0 montre queall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC

5

Je pense que cela fera aussi:

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

Mais comparé aux réponses de Salvado et Yaroslav, je ne sais pas laquelle est la meilleure.


Celui-ci fonctionnait avec un graphique importé d'un fichier gelé_inférence_graph.pb utilisé dans l'API de détection d'objet tensorflow. Merci
simo23

4

La réponse acceptée ne vous donne qu'une liste de chaînes avec les noms. Je préfère une approche différente, qui vous donne un accès (presque) direct aux tenseurs:

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

list_of_tuplescontient maintenant chaque tenseur, chacun dans un tuple. Vous pouvez également l'adapter pour obtenir directement les tenseurs:

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

4

Puisque l'OP a demandé la liste des tenseurs au lieu de la liste des opérations / nœuds, le code devrait être légèrement différent:

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

Les réponses précédentes sont bonnes, j'aimerais juste partager une fonction utilitaire que j'ai écrite pour sélectionner Tensors dans un graphique:

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

Donc, si vous avez un graphique avec des opérations:

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

Puis courir

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

Retour:

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

0

Cela a fonctionné pour moi:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.