В Tensorflow, получить имена всех тензоров в графе


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

однако мне трудно найти правильный синтаксис имени тензора, даже зная его имя (и я путаюсь между операцией и тензорами), поэтому я использую tensorboard для построения графика и поиска имени.

есть ли способ перечислить все тензоры в графе без использования тензорной доски?

6 62

6 ответов:

можно сделать

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

кроме того, если вы прототипируете в ноутбуке IPython, вы можете показать график непосредственно в ноутбуке, см. show_graph функция в глубоком сне Александра ноутбук

есть способ сделать это немного быстрее, чем в ответе Ярослава с помощью get_operations. Вот краткий пример:

import tensorflow as tf
a = tf.constant(1.3, name='const_A')
b = tf.Variable(3.1, name='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() вы можете получить информацию, которую вы хотите.

и этот коммит сделано сегодня в TensorFlow узнать, что обеспечивает функцию get_variable_names в оценщике, который можно использовать для быстрого извлечения всех имен переменных.

Я думаю, что это тоже будет делать:

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

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

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

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

предыдущие ответы хороши, я просто хотел бы поделиться полезной функцией, которую я написал, чтобы выбрать тензоры из графика:

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