W Tensorflow pobierz nazwy wszystkich Tensorów na wykresie

118

Tworzę sieci neuronowe z Tensorflowi skflow; z jakiegoś powodu chcę uzyskać wartości niektórych wewnętrznych tensorów dla danego wejścia, więc używam myClassifier.get_layer_value(input, "tensorName"), myClassifierbędąc skflow.estimators.TensorFlowEstimator.

Jednak trudno mi znaleźć poprawną składnię nazwy tensora, nawet znając jej nazwę (i mylę się między operacją a tensorami), więc używam tensorboard do wykreślenia wykresu i wyszukania nazwy.

Czy istnieje sposób na wyliczenie wszystkich tensorów na wykresie bez korzystania z tensorboard?

P. Camilleri
źródło

Odpowiedzi:

189

Możesz to zrobić

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

Ponadto, jeśli tworzysz prototyp w notatniku IPython, możesz wyświetlić wykres bezpośrednio w notatniku, zobacz show_graphfunkcję w notatniku Alexander's Deep Dream

Jarosław Bulatow
źródło
2
Możesz filtrować to np. if "Variable" in n.opPod kątem zmiennych, dodając je na końcu rozumienia.
Radu,
Czy istnieje sposób na uzyskanie określonego węzła, jeśli znasz jego nazwę?
Rocket Pingu
Aby dowiedzieć się więcej o węzłach grafów: tensorflow.org/extend/tool_developers/#nodes
Ivan Talalaev
3
Powyższe polecenie daje nazwy wszystkich operacji / węzłów. Aby uzyskać nazwy wszystkich tensorów, wykonaj: tensors_per_node = [node.values ​​() dla węzła w graph.get_operations ()] tensor_names = [tensor.name for tensors in tensors_per_node for tensor in
tensors
24

Jest sposób, aby zrobić to trochę szybciej niż w odpowiedzi Jarosława, używając get_operations . Oto krótki przykład:

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
źródło
2
Nie możesz zdobyć Tensorów za pomocą tf.get_operations(). Tylko operacja, którą możesz uzyskać.
Soulduck
14

Spróbuję podsumować odpowiedzi:

Aby uzyskać wszystkie węzły (typ tensorflow.core.framework.node_def_pb2.NodeDef):

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

Aby uzyskać wszystkie operacje (wpisz tensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

Aby uzyskać wszystkie zmienne (typ tensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

Aby uzyskać wszystkie tensory (typ tensorflow.python.framework.ops.Tensor) :

all_tensors = [tensor for op in tf.get_default_graph().get_operations() for tensor in op.values()]
Szabolcs
źródło
11

tf.all_variables() może uzyskać potrzebne informacje.

Ponadto to zatwierdzenie dokonane dzisiaj w TensorFlow Learn, które udostępnia funkcję get_variable_namesw estymatorze, której można użyć do łatwego pobierania wszystkich nazw zmiennych.

Yuan Tang
źródło
Ta funkcja jest przestarzała
CAFEBABE
8
... a jego następcą jesttf.global_variables()
bluenote10
11
to pobiera tylko zmienne, a nie tensory.
Rajarshee Mitra
W Tensorflow 1.9.0 pokazuje toall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC
5

Myślę, że to też wystarczy:

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

Ale w porównaniu z odpowiedziami Salvado i Jarosława nie wiem, która z nich jest lepsza.

Lu Howyou
źródło
Ten działał z wykresem zaimportowanym z pliku frozen_inference_graph.pb używanego w interfejsie API wykrywania obiektów tensorflow. Dzięki
simo23
4

Zaakceptowana odpowiedź zawiera tylko listę ciągów z nazwami. Wolę inne podejście, które daje (prawie) bezpośredni dostęp do tensorów:

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

list_of_tupleszawiera teraz każdy tensor, każdy w krotce. Możesz również dostosować to, aby uzyskać tensory bezpośrednio:

graph = tf.get_default_graph()
list_of_tuples = [op.values()[0] for op in graph.get_operations()]
Picard
źródło
4

Ponieważ PO poprosił o listę tensorów zamiast listy operacji / węzłów, kod powinien być nieco inny:

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
źródło
3

Poprzednie odpowiedzi są dobre, chciałbym tylko udostępnić funkcję narzędzia, którą napisałem, aby wybrać Tensory z wykresu:

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

Więc jeśli masz wykres z opami:

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

Potem bieg

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

zwroty:

['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']
przetrząsać
źródło
0

To zadziałało dla mnie:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
Akshaya Natarajan
źródło