Проверьте, является ли узел операцией или тензором в Tensorflow Graph

1

Использование names = [n.name for n in graph.as_graph_def().node] Я могу получить все имена узлов в графике.

Например, скажем, это печатает:

['model/classifier/dense/kernel/Initializer/random_uniform/shape',
'model/classifier/dense/kernel/Initializer/random_uniform/min',
'model/classifier/dense/kernel/Initializer/random_uniform/max',
'model/classifier/dense/kernel/Initializer/random_uniform/RandomUniform',
'model/classifier/dense/kernel/Initializer/random_uniform/sub',
'model/classifier/dense/kernel/Initializer/random_uniform/mul',
'model/classifier/dense/kernel/Initializer/random_uniform',
'model/classifier/dense/kernel',
'model/classifier/dense/kernel/Assign',
'model/classifier/dense/kernel/read',
'model/classifier/dense/bias/Initializer/zeros/shape_as_tensor',
'model/classifier/dense/bias/Initializer/zeros/Const',
'model/classifier/dense/bias/Initializer/zeros',
'model/classifier/dense/bias',
'model/classifier/dense/bias/Assign',
'model/classifier/dense/bias/read',
'model/classifier/dense/MatMul',
'model/classifier/dense/BiasAdd'] 

Как я могу выбрать только операции или только тензоры?

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

  • строковые манипуляции из приведенных выше имен

    • например, получить model/classifier/dense/kernel:

      tensor = [graph.get_tensor_by_name(n + ":0") 
          for n in names if 'classifier' in n and
          'kernel' in name and 
          not n.split('kernel')[-1]
      ][0]
      
    • Как вы можете себе представить, это может быть очень склонным к ошибкам и очень тензорным
  • try/except я мог бы получить тензоры, которые являются выходами этих операций:

    tensors = []
    for name in names:
        try:
            tensors.append(graph.get_tensor_by_name(name + ":0"))
        except KeyError:
            pass
    
    • Но опять же это всего лишь обходное решение и не решает проблему выбора: что, если я просто хочу kernel Tensor?
Теги:
tensorflow

3 ответа

1
Лучший ответ

Хорошо, я нашел ответ. В основном это связано с тем, что я действительно искал переменные, а не только обычные тензоры.

Поэтому это так просто:

with graph.as_default():
    kernel = [v for v in tf.global_variables()
        if 'optimization' not in v.name and
        'classifier' in v.name
        and 'kernel' in v.name
    ][0]
1

если вы хотите лучше почувствовать операции и узлы, попробуйте запустить тензограмму. Вы можете писать сводные файлы с помощью tf.summary.FileWriter("folder_name", sess.graph).

Мои знания о тензорном потоке ограничены, но я думаю, что имена тензоров и имена операторов почти одинаковы. Оператор может иметь несколько выходов, и каждый из этих выходов называется тензором. Таким образом, имя тензора просто является именем operator_name:output_index, output_index часто равен 0, так как большинство операторов имеют один вывод. Поэтому давайте sess.graph.get_tensor_by_name("model/classifier/dense/kernel/Initializer/random_uniform/mul:0") шанс. Я не уверен, что если такие длинные имена практичны, хотя.

Извините, если предоставленная информация не соответствует 100%, я просто начинающий.

  • 0
    Вы правы, это частично отвечает на мой вопрос (поэтому проголосовал, но не принял). Но моя проблема также в том, что некоторые могут вообще не иметь выходных данных, например, инициализирующая операция. Обходной путь должен был бы попытаться / кроме KeyError, но кажется, что должно существовать что-то лучшее.
-2

Вы можете использовать isinstance (item, class) и сравнить узлы с классом tf.Operation следующим образом: [n.name for n in graph.as_graph_def().node if isinstance(n, tf.Operation)]

  • 0
    Нет, это не работает, возвращает пустой список, так как узлы не будут ни ( tf.Operation ни tf.Tensor )
  • 0
    Вы можете проверить их __class__?
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню