代码之家  ›  专栏  ›  技术社区  ›  ted

检查tensorflow图中的节点是运算还是张量

  •  1
  • ted  · 技术社区  · 7 年前

    使用 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?
    3 回复  |  直到 7 年前
        1
  •  1
  •   ted    7 年前

    如果您想更好地了解操作和节点,请尝试运行tensorboard。 您可以使用 tf.summary.FileWriter("folder_name", sess.graph) .

    我的TensorFlow知识有限,但我认为Tensor名称和运算符名称几乎相同。一个运算符可以有多个输出,每个输出称为张量。因此,张量的名字是 operator_name:output_index , the output_index 往往是 0 ,因为大多数运算符只有一个输出。 那就跑吧 sess.graph.get_tensor_by_name("model/classifier/dense/kernel/Initializer/random_uniform/mul:0") 一个机会。不过,我不确定有这么长的名字是否可行。

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

        2
  •  1
  •   piet.t Charis A.    7 年前

    好的,我找到了答案。主要是因为我真正想要的是 变量 不仅仅是普通的张量。

    因此,这很容易做到:

    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]
    
        3
  •  -1
  •   Vasilis    7 年前

    您可以使用isinstance(item,class)并将节点与tf.operation类进行比较,如下所示 [n.name for n in graph.as_graph_def().node if isinstance(n, tf.Operation)]