Di Tensorflow, dapatkan nama semua Tensor dalam grafik

118

Saya membuat jaringan saraf dengan Tensorflowdan skflow; untuk beberapa alasan saya ingin mendapatkan nilai dari beberapa tensor dalam untuk input tertentu, jadi saya menggunakan myClassifier.get_layer_value(input, "tensorName"), myClassifiermenjadi a skflow.estimators.TensorFlowEstimator.

Namun, saya merasa sulit untuk menemukan sintaks yang benar dari nama tensor, bahkan mengetahui namanya (dan saya bingung antara operasi dan tensor), jadi saya menggunakan tensorboard untuk menggambar grafik dan mencari namanya.

Apakah ada cara untuk menghitung semua tensor dalam grafik tanpa menggunakan tensorboard?

P. Camilleri
sumber

Jawaban:

189

Anda dapat melakukan

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

Selain itu, jika Anda membuat prototipe di notebook IPython, Anda dapat menunjukkan grafik langsung di notebook, lihat show_graphfungsi di notebook Deep Dream Alexander

Yaroslav Bulatov
sumber
2
Anda dapat memfilter ini untuk variabel misalnya dengan menambahkan if "Variable" in n.opdi akhir pemahaman.
Radu
Apakah ada cara untuk mendapatkan node tertentu jika Anda tahu namanya?
Rocket Pingu
Untuk membaca lebih lanjut tentang node grafik: tensorflow.org/extend/tool_developers/#nodes
Ivan Talalaev
3
Perintah di atas menghasilkan nama semua operasi / node. Untuk mendapatkan nama semua tensor, lakukan: tensors_per_node = [node.values ​​() untuk node dalam graph.get_operations ()] tensor_names = [tensor.name untuk tensor di tensors_per_node untuk tensor dalam tensor]
gebbissimo
24

Ada cara untuk melakukannya sedikit lebih cepat daripada jawaban Yaroslav dengan menggunakan get_operations . Berikut ini contoh singkatnya:

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))
Salvador Dali
sumber
2
Anda tidak bisa menggunakan Tensor tf.get_operations(). Hanya operasi yang bisa Anda dapatkan.
Soulduck
14

Saya akan mencoba meringkas jawabannya:

Untuk mendapatkan semua node (tipe tensorflow.core.framework.node_def_pb2.NodeDef):

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

Untuk mendapatkan semua operasi (tipe tensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

Untuk mendapatkan semua variabel (tipe tensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

Untuk mendapatkan semua tensor (tipe tensorflow.python.framework.ops.Tensor) :

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

tf.all_variables() dapat memberi Anda informasi yang Anda inginkan.

Selain itu, commit ini dibuat hari ini di TensorFlow Learn yang menyediakan fungsi get_variable_namesdi estimator yang bisa Anda gunakan untuk mengambil semua nama variabel dengan mudah.

Yuan Tang
sumber
Fungsi ini tidak digunakan lagi
CAFEBABE
8
... dan penggantinya adalahtf.global_variables()
bluenote10
11
ini hanya mengambil variabel, bukan tensor.
Rajarshee Mitra
Dalam Tensorflow 1.9.0 menunjukkan bahwaall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC
5

Saya pikir ini juga akan berhasil:

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

Tetapi dibandingkan dengan jawaban Salvado dan Yaroslav, saya tidak tahu mana yang lebih baik.

Lu Howyou
sumber
Yang ini bekerja dengan grafik yang diimpor dari file frozen_inference_graph.pb yang digunakan dalam API deteksi objek tensorflow. Terima kasih
simo23
4

Jawaban yang diterima hanya memberi Anda daftar string dengan nama. Saya lebih suka pendekatan yang berbeda, yang memberi Anda (hampir) akses langsung ke tensor:

graph = tf.get_default_graph()
list_of_tuples = [op.values() for op in graph.get_operations()]

list_of_tuplessekarang berisi setiap tensor, masing-masing di dalam tupel. Anda juga bisa menyesuaikannya untuk mendapatkan tensor secara langsung:

graph = tf.get_default_graph()
list_of_tuples = [op.values()[0] for op in graph.get_operations()]
Picard
sumber
4

Karena OP meminta daftar tensor dan bukan daftar operasi / node, kodenya harus sedikit berbeda:

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]
gebbissimo.dll
sumber
3

Jawaban sebelumnya bagus, saya hanya ingin membagikan fungsi utilitas yang saya tulis untuk memilih Tensor dari grafik:

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

Jadi jika Anda memiliki grafik dengan 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']

Lalu lari

get_graph_op(tf.get_default_graph(), ['dense', '!kernel'], 'or', ['Assign'])

kembali:

['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']
ted
sumber
0

Ini berhasil untuk saya:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
Akshaya Natarajan
sumber