En Tensorflow, obtenga los nombres de todos los tensores en un gráfico

Estoy creando redes neuronales con Tensorflow y skflow ; por alguna razón, quiero obtener los valores de algunos tensores internos para una entrada determinada, por lo que estoy usando myClassifier.get_layer_value(input, "tensorName") , siendo skflow.estimators.TensorFlowEstimator un skflow.estimators.TensorFlowEstimator .

Sin embargo, me resulta difícil encontrar la syntax correcta del nombre del tensor, incluso sabiendo su nombre (y me estoy confundiendo entre la operación y los tensores), así que estoy usando el tensorboard para trazar la gráfica y buscar el nombre.

¿Hay una manera de enumerar todos los tensores en un gráfico sin usar tensorboard?

Tu puedes hacer

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

Además, si está realizando un prototipo en un cuaderno IPython, puede mostrar el gráfico directamente en el cuaderno, vea la función show_graph en el cuaderno Deep Dream de Alexander

Hay una manera de hacerlo un poco más rápido que en la respuesta de Yaroslav utilizando get_operations . Aquí hay un ejemplo rápido:

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

tf.all_variables() puede proporcionarle la información que desea.

Además, esta confirmación realizada hoy en TensorFlow Learn que proporciona una función get_variable_names en el estimador que puede utilizar para recuperar fácilmente todos los nombres de variables.

La respuesta aceptada solo le proporciona una lista de cadenas con los nombres. Prefiero un enfoque diferente, que le da (casi) acceso directo a los tensores:

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

list_of_tuples ahora contiene cada tensor, cada uno dentro de una tupla. También puedes adaptarlo para conseguir los tensores directamente:

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

Creo que esto también lo hará:

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

Pero en comparación con las respuestas de Salvado y Yaroslav, no sé cuál es mejor.

Las respuestas anteriores son buenas, me gustaría compartir una función de utilidad que escribí para seleccionar Tensores de un gráfico:

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

Así que si tienes una gráfica con 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'] 

Entonces corriendo

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

devoluciones:

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

Esto funcionó para mí:

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

Como el OP solicitó la lista de los tensores en lugar de la lista de operaciones / nodos, el código debería ser ligeramente diferente:

 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]