python - graficas - En Tensorflow, obtenga los nombres de todos los tensores en un gráfico
matplotlib ejes (9)
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]
Estoy creando redes neuronales con
Tensorflow
y
skflow
;
por alguna razón, quiero obtener los valores de algunos tensores internos para una entrada dada, por lo que estoy usando
myClassifier.get_layer_value(input, "tensorName")
,
myClassifier
es un
skflow.estimators.TensorFlowEstimator
.
Sin embargo, me resulta difícil encontrar la sintaxis 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 el gráfico y buscar el nombre.
¿Hay alguna manera de enumerar todos los tensores en un gráfico sin usar el tensorboard?
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.
Esto funcionó para mí:
all_tensors = [tensor for op in tf.get_default_graph().get_operations() for tensor in op.values()]
Hay una manera de hacerlo un poco más rápido que en la respuesta de Yaroslav usando 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))
La respuesta aceptada solo le brinda 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 puede adaptarlo para obtener los tensores directamente:
graph = tf.get_default_graph()
list_of_tuples = [op.values()[0] for op in graph.get_operations()]
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)
]
Entonces, si tiene un gráfico con operaciones:
[''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'']
Trataré de resumir las respuestas:
Para obtener todos los nodos:
for n in tf.get_default_graph().as_graph_def().node:
print(''/n'',n)
Estos tienen el tipo
tensorflow.core.framework.node_def_pb2.NodeDef
Para obtener todas las operaciones:
all_nodes = [n for n in tf.get_default_graph().as_graph_def().node]
Estos tienen el tipo
tensorflow.python.framework.ops.Operation
Para obtener todas las variables:
all_ops = tf.get_default_graph().get_operations()
Estos tienen el tipo
tensorflow.python.ops.resource_variable_ops.ResourceVariable
Y finalmente, para responder la pregunta, para obtener todos los tensores :
all_vars = tf.global_variables()
Estos tienen el tipo
tensorflow.python.framework.ops.Tensor
Tu puedes hacer
[n.name for n in tf.get_default_graph().as_graph_def().node]
Además, si está
show_graph
prototipos en una computadora portátil IPython, puede mostrar el gráfico directamente en la computadora portátil, consulte la función
show_graph
en la
notebook
Deep Dream de Alexander
tf.all_variables()
puede obtener 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 usar para recuperar todos los nombres de variables fácilmente.