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?
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
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))
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.
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()]
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.
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']
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
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]
Das hat für mich funktioniert:
for n in tf.get_default_graph().as_graph_def().node:
print('\n',n)