Tensorflowで、グラフ内のすべてのTensorの名前を取得します


118

とでニューラルネットを作成しTensorflowていskflowます。なんらかの理由で、特定の入力に対していくつかの内部テンソルの値を取得したいので、を使用myClassifier.get_layer_value(input, "tensorName")myClassifierていskflow.estimators.TensorFlowEstimatorます。

ただし、テンソル名の正しい構文を見つけるのは難しく、その名前を知っていても(操作とテンソルの間で混乱します)、テンソルボードを使用してグラフをプロットし、名前を探します。

テンソルボードを使用せずにグラフのすべてのテンソルを列挙する方法はありますか?

回答:


189

できるよ

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

また、IPythonノートブックでプロトタイプを作成している場合は、ノートブックで直接グラフを表示できますshow_graph。AlexanderのDeep Dream ノートブックの機能を参照してください


2
if "Variable" in n.op内包表記の最後に追加することで、変数などをフィルタリングできます。
Radu 2017

名前がわかっている場合に特定のノードを取得する方法はありますか?
ロケットピングー

グラフノードの詳細を読むには:tensorflow.org/extend/tool_developers/#nodes
Ivan Talalaev

3
上記のコマンドは、すべての操作/ノードの名前を生成します。すべてのテンソルの名前を取得するには、実行します。tensors_per_nodeを= [graph.get_operations内のノードのためのnode.values()()] tensor_names = [テンソルでテンソルのためtensors_per_nodeでテンソルのためtensor.name]
gebbissimo

25

get_operationsを使用して、ヤロスラフの答えよりも少し速く行う方法があります。ここに簡単な例があります:

import tensorflow as tf

a = tf.constant(1.3, name='const_a')
b = tf.Variable(3.1, name='variable_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))

1
を使用してテンソルを取得することはできませんtf.get_operations()。あなたが得ることができる操作のみ。
Soulduck

14

私は答えを要約しようとします:

すべてのノードを取得するには(タイプtensorflow.core.framework.node_def_pb2.NodeDef):

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

すべて取得するには、OPS(タイプtensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

すべての変数を取得するには(タイプtensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

すべてのテンソルを取得するには(タイプtensorflow.python.framework.ops.Tensor

all_tensors = [tensor for op in tf.get_default_graph().get_operations() for tensor in op.values()]

11

tf.all_variables() 必要な情報を入手できます。

また、TensorFlow Learnで本日行われたこのコミットは、get_variable_namesすべての変数名を簡単に取得するために使用できるestimatorの機能を提供します。


この機能は廃止されました
CAFEBABE 2017年

8
...そしてその後継はtf.global_variables()
bluenote10

11
これはテンソルではなく変数のみをフェッチします。
Rajarshee Mitra 2017

Tensorflow 1.9.0は​​それを示していますall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC

5

これもうまくいくと思います:

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

しかし、サルバドやヤロスラフの答えと比較して、どちらが良いかわかりません。


これは、tensorflowオブジェクト検出APIで使用されるfrozen_inference_graph.pbファイルからインポートされたグラフで機能しました。ありがとう
simo23

4

受け入れられた回答は、名前を含む文字列のリストのみを提供します。私はテンソルに(ほぼ)直接アクセスできる別のアプローチを好みます:

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

これは、演算だけでなく、演算の実際の出力テンソルをフェッチする方法です。
Szabolcs

4

OPはオペレーション/ノードのリストの代わりにテンソルのリストを要求したので、コードは少し異なります:

graph = tf.get_default_graph()    
tensors_per_node = [node.values() for node in graph.get_operations()]
tensor_names = [tensor.name for tensors in tensors_per_node for tensor in tensors]

3

以前の答えは良いです、私はグラフからテンソルを選択するために書いたユーティリティ関数を共有したいと思います:

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.