Trong Tensorflow, lấy tên của tất cả các Tensor trong biểu đồ


118

Tôi đang tạo mạng lưới thần kinh với Tensorflowskflow; vì lý do nào đó, tôi muốn nhận giá trị của một số tensors bên trong cho một đầu vào nhất định, vì vậy tôi đang sử dụng myClassifier.get_layer_value(input, "tensorName"), myClassifierlà a skflow.estimators.TensorFlowEstimator.

Tuy nhiên, tôi cảm thấy rất khó để tìm ra cú pháp chính xác của tên tensor, ngay cả khi biết tên của nó (và tôi đang nhầm lẫn giữa hoạt động và tensor), vì vậy tôi đang sử dụng tensorboard để vẽ đồ thị và tìm tên.

Có cách nào để liệt kê tất cả các tenxơ trong một biểu đồ mà không cần sử dụng bảng căng thẳng không?

Câu trả lời:


189

Bạn có thể làm

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

Ngoài ra, nếu bạn đang tạo mẫu trong sổ ghi chép IPython, bạn có thể hiển thị biểu đồ trực tiếp trong sổ ghi chép, xem show_graphchức năng trong sổ ghi chép Giấc mơ sâu sắc của Alexander


2
Bạn có thể lọc điều này cho các biến, ví dụ: bằng cách thêm if "Variable" in n.opvào cuối phần hiểu.
Radu

Có cách nào để lấy một nút cụ thể nếu bạn biết tên không?
Rocket Pingu

Để đọc thêm về các nút biểu đồ: tensorflow.org/extend/tool_developers/#nodes
Ivan Talalaev

3
Lệnh trên trả về tên của tất cả các thao tác / nút. Để có được tên của tất cả tensors, làm: tensors_per_node = [node.values () cho nút trong graph.get_operations ()] tensor_names = [tensor.name cho tensors trong tensors_per_node cho tensor trong tensors]
gebbissimo

25

Có một cách để làm điều đó nhanh hơn một chút so với câu trả lời của Yaroslav bằng cách sử dụng get_operations . Đây là một ví dụ nhanh:

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
Bạn không thể sử dụng Tensors tf.get_operations(). Chỉ hoạt động bạn có thể nhận được.
Soulduck vào

14

Tôi sẽ cố gắng tóm tắt các câu trả lời:

Để lấy tất cả các nút (loại tensorflow.core.framework.node_def_pb2.NodeDef):

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

Để nhận tất cả các hoạt động (loại tensorflow.python.framework.ops.Operation):

all_ops = tf.get_default_graph().get_operations()

Để lấy tất cả các biến (kiểu tensorflow.python.ops.resource_variable_ops.ResourceVariable):

all_vars = tf.global_variables()

Để nhận tất cả các tensors (loại 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() có thể cung cấp cho bạn thông tin bạn muốn.

Ngoài ra, cam kết này được thực hiện hôm nay trong TensorFlow Learn cung cấp một hàm get_variable_namestrong công cụ ước tính mà bạn có thể sử dụng để truy xuất tất cả các tên biến một cách dễ dàng.


Chức năng này không được dùng nữa
CAFEBABE

8
... và người kế nhiệm của nó làtf.global_variables()
bluenote10

11
điều này chỉ tìm nạp các biến chứ không phải tensor.
Rajarshee Mitra

Trong Tensorflow 1.9.0 cho thấy điều đóall_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02
stackoverYC

5

Tôi nghĩ điều này cũng sẽ làm được:

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

Nhưng so với câu trả lời của Salvado và Yaroslav, tôi không biết cái nào tốt hơn.


Biểu đồ này đã hoạt động với một biểu đồ được nhập từ tệp freeze_inference_graph.pb được sử dụng trong API phát hiện đối tượng tensorflow. Cảm ơn
simo23

4

Câu trả lời được chấp nhận chỉ cung cấp cho bạn danh sách các chuỗi có tên. Tôi thích một cách tiếp cận khác, cho phép bạn (gần như) truy cập trực tiếp vào các tensors:

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

list_of_tuplesbây giờ chứa mọi tensor, mỗi tensor trong một tuple. Bạn cũng có thể điều chỉnh nó để có được những người căng thẳng:

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

Đây là cách để lấy hàng chục đầu ra thực tế của các hoạt động, không chỉ các hoạt động.
Szabolcs

4

Vì OP đã yêu cầu danh sách các tensor thay vì danh sách các hoạt động / nút, nên mã sẽ hơi khác một chút:

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

Các câu trả lời trước rất hay, tôi chỉ muốn chia sẻ một hàm tiện ích mà tôi đã viết để chọn Tensors từ biểu đồ:

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

Vì vậy, nếu bạn có một biểu đồ với các hoạt động:

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

Sau đó chạy

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

trả lại:

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

Điều này đã làm việc cho tôi:

for n in tf.get_default_graph().as_graph_def().node:
    print('\n',n)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.