Skip to main content
 首页 » 编程设计

python之检查节点是 Tensorflow Graph 中的操作还是张量

2024年12月31日28shihaiming

使用 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 张量怎么办?

请您参考如下方法:

如果您想更好地感受操作和节点,请尝试运行 tensorboard。 您可以使用 tf.summary.FileWriter("folder_name", sess.graph) 编写摘要文件。

我的 tensorflow 知识有限,但我认为张量名称和运算符名称几乎相同。一个算子可以有多个输出,这些输出中的每一个都称为张量。因此,张量名称只是 operator_name:output_index,output_index 通常是 0,因为大多数运算符只有一个输出。 所以给运行 sess.graph.get_tensor_by_name("model/classifier/dense/kernel/Initializer/random_uniform/mul:0") 一个机会。不过,我不确定使用这么长的名称是否实用。

抱歉,如果提供的信息不是 100% 正确,我只是一个初学者。