Использование 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?Хорошо, я нашел ответ. В основном это связано с тем, что я действительно искал переменные, а не только обычные тензоры.
Поэтому это так просто:
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]
если вы хотите лучше почувствовать операции и узлы, попробуйте запустить тензограмму. Вы можете писать сводные файлы с помощью 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%, я просто начинающий.
Вы можете использовать isinstance (item, class) и сравнить узлы с классом tf.Operation следующим образом: [n.name for n in graph.as_graph_def().node if isinstance(n, tf.Operation)]
tf.Operation
ни tf.Tensor
)