У Tensorflow знайдіть імена всіх тенорів у графі


118

Я створюю нейронні мережі з Tensorflowі skflow; я чомусь хочу отримати значення деяких внутрішніх тензорів для заданого входу, тому я використовую myClassifier.get_layer_value(input, "tensorName"), myClassifierбудучи a skflow.estimators.TensorFlowEstimator.

Однак мені важко знайти правильний синтаксис імені тензора, навіть знаючи його ім’я (і я плутаюсь між операцією та тензорами), тому я використовую тензорну дошку для побудови графіка та пошуку імені.

Чи є спосіб перерахувати всі тензори в графі, не використовуючи тензорну дошку?

Відповіді:


189

Ви можете зробити

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

Крім того, якщо ви прототипуєте в зошиті IPython, ви можете показати графік безпосередньо в ноутбуці, див. show_graphФункцію в зошиті Alexander Deep Dream


2
Ви можете відфільтрувати це, наприклад, для змінних, додавши if "Variable" in n.opв кінці розуміння.
Раду

Чи є спосіб отримати певний вузол, якщо ви знаєте ім'я?
Ракетний Пінгу

Детальніше про вузли графів: tensorflow.org/extend/tool_developers/#nodes
Іван

3
Команда вище дає назви всіх операцій / вузлів. Щоб отримати імена всіх тенорів, зробіть: tensors_per_node = [node.values ​​() для вузла в graph.get_operations ()] tensor_names = [tensor.name для тензорів в tensors_per_node для тензора в
тензорах

24

Є спосіб зробити це трохи швидше, ніж у відповіді Ярослава, використовуючи get_operations . Ось короткий приклад:

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
Ви не можете використовувати тензори tf.get_operations(). Тільки операцію ви можете отримати.
Солдук

14

Спробую узагальнити відповіді:

Щоб отримати всі вузли (тип tensorflow.core.framework.node_def_pb2.NodeDef):

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

Щоб отримати всі опції (тип tensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

Щоб отримати всі змінні (тип tensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

Щоб отримати всі тензори (тип 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() може отримати інформацію, яку ви хочете.

Крім того, це зобов'язання, зроблене сьогодні в TensorFlow Learn, що забезпечує функцію get_variable_namesв оцінювачі, яку ви можете використовувати для легкого отримання всіх імен змінних.


Ця функція застаріла
CAFEBABE

8
... а його наступникtf.global_variables()
bluenote10

11
це отримує лише змінні, а не тензори.
Rajarshee Mitra

У Tensorflow 1.9.0 показує , щоall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC

5

Я думаю, що це теж зробить:

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

Але порівняно з відповідями Сальвадо та Ярослава, я не знаю, який із них кращий.


Цей працював з графіком, імпортованим з файлу Заморожений_Інференція_graph.pb, який використовується в API виявлення об'єктів tensorflow. Дякую
simo23

4

Прийнята відповідь дає лише список рядків із назвами. Я віддаю перевагу іншому підходу, який дає вам (майже) прямий доступ до тензорів:

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

list_of_tuplesтепер міститься кожен тензор, кожен в межах кордону. Ви також можете адаптувати його, щоб отримати тензори безпосередньо:

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

4

Оскільки ОП запитувало список тензорів замість переліку операцій / вузлів, код повинен бути дещо іншим:

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

Попередні відповіді хороші, я просто хотів би поділитися функцією утиліти, яку я написав, щоб вибрати тензори з графіка:

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

Отже, якщо у вас є графік з 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']

Потім біг

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

повертає:

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.