Tensorflow'da tüm Tensörlerin adlarını bir grafikte alın


118

Ben ile sinir ağları oluşturma Tensorflowve skflow; Bazı nedenlerden dolayı, belirli bir girdi için bazı iç tensörlerin değerlerini elde etmek istiyorum, bu yüzden kullanıyorum myClassifier.get_layer_value(input, "tensorName"), myClassifiera olarak skflow.estimators.TensorFlowEstimator.

Bununla birlikte, tensör adının doğru sözdizimini bulmayı, adını bile bilmekte zor buluyorum (ve işlem ile tensörler arasında kafam karışıyor), bu yüzden grafiği çizmek ve adı aramak için tensorboard kullanıyorum.

Bir grafikteki tüm tensörleri tensorboard kullanmadan sıralamanın bir yolu var mı?

Yanıtlar:


189

Yapabilirsin

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

Ayrıca, bir IPython not defterinde prototip oluşturuyorsanız grafiği doğrudan not defterinde gösterebilirsiniz, show_graphAlexander'ın Deep Dream not defterinde işleve bakın


2
Anlamanın if "Variable" in n.opsonuna ekleyerek bunu örneğin değişkenler için filtreleyebilirsiniz .
Radu

İsmini biliyorsanız belirli bir düğümü almanın bir yolu var mı?
Rocket Pingu

Grafik düğümleri hakkında daha fazla bilgi edinmek için: tensorflow.org/extend/tool_developers/#nodes
Ivan Talalaev

3
Yukarıdaki komut tüm işlemlerin / düğümlerin adlarını verir. Tüm tensörlerin adlarını almak için şunu yapın: tensors_per_node = [node.values ​​(), graph.get_operations ()] tensor_names = [tensor_per_node tensörler için tensor.name tensörlerde tensör için]
gebbissimo

24

Get_operations kullanarak Yaroslav'nın cevabından biraz daha hızlı yapmanın bir yolu var . İşte hızlı bir örnek:

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

2
Tensörleri kullanarak elde edemezsiniz tf.get_operations(). Alabileceğiniz tek işlem.
Soulduck

14

Cevapları özetlemeye çalışacağım:

Tüm düğümleri almak için (yazın tensorflow.core.framework.node_def_pb2.NodeDef):

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

Tüm operasyonları almak için (tip tensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

Tüm değişkenleri almak için (tür tensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

Tüm tensörleri (tip tensorflow.python.framework.ops.Tensor) elde etmek için :

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

11

tf.all_variables() size istediğiniz bilgileri verebilir.

Ayrıca, bugün TensorFlow Learn'de yapılan bu taahhüt , get_variable_namestüm değişken adlarını kolayca almak için kullanabileceğiniz bir tahmincide bir işlev sağlar.


Bu işlev kullanımdan kaldırıldı
CAFEBABE

8
... ve halefitf.global_variables()
bluenote10

11
bu sadece değişkenleri getirir, tensörleri değil.
Rajarshee Mitra

Tensorflow'da 1.9.0 şunu gösteriyorall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC

5

Bunun da işe yarayacağını düşünüyorum:

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

Ancak Salvado ve Yaroslav'nın cevaplarıyla karşılaştırıldığında hangisinin daha iyi olduğunu bilmiyorum.


Bu, tensorflow nesne algılama API'sinde kullanılan bir frozen_inference_graph.pb dosyasından içe aktarılan bir grafikle çalıştı. Teşekkürler
simo23

4

Kabul edilen cevap size yalnızca isimlerle birlikte dizelerin bir listesini verir. Tensörlere (neredeyse) doğrudan erişim sağlayan farklı bir yaklaşımı tercih ediyorum:

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

list_of_tuplesşimdi her biri bir demet içinde her tensörü içerir. Tensörleri doğrudan almak için de uyarlayabilirsiniz:

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

4

OP, işlemler / düğümler listesi yerine tensörlerin listesini istediğinden, kod biraz farklı olmalıdır:

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

Önceki cevaplar iyi, bir grafikten Tensörleri seçmek için yazdığım bir yardımcı program işlevini paylaşmak istiyorum:

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

Öyleyse, operasyonları olan bir grafiğiniz varsa:

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

Sonra koşmak

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

İadeler:

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

0

Bu benim için çalıştı:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.