寻找Tensorflow操作的输入张力子。

问题描述 投票:0回答:1

我正试图为TensorFlow计算图生成某种文本表示。我知道Tensorboard可以为我提供可视化。然而,我需要某种表示方式(邻接矩阵或邻接列表),从那里我可以解析与图相关的信息。

到目前为止,我已经尝试了以下几种方法。

import tensorflow as tf

a = tf.constant(1.3, name = const_a)
b = tf.constant(3.1, name = const_b)
c = tf.add(a,b, name = 'addition')
d = tf.multiply(c,a, name = 'multiplication')
e = tf.add(d,c, name = 'addition_1')

with tf.Session() as sess:
     print(sess.run([c,d,e]))

在这之后,我决定将图形对象保存在一个单独的变量中,并尝试从那里解析信息。

graph = tf.get_default_graph()

我发现了如何从这里获得所有操作的列表。这个 文档。

for op in graph.get_operations():
     print(op.values())

这一部分实际上为我提供了计算图的节点信息。

(<tf.Tensor 'const_a:0' shape=() dtype=float32>,)
(<tf.Tensor 'const_b:0' shape=() dtype=float32>,)
(<tf.Tensor 'addition:0' shape=() dtype=float32>,)
(<tf.Tensor 'multiplication:0' shape=() dtype=float32>,)
(<tf.Tensor 'addition_1:0' shape=() dtype=float32>,)

然而,我似乎找不到任何方法可以为我提供计算图的边的信息。我找不到任何方法可以给我与每个操作相关的输入时序。我想知道,名为 addition_1 有由操作产生的输入时序 additionmultiplication; 或可以用来推导这些信息的东西。从 文件看来 Operation 对象有一个名为 inputs 这可能是我正在寻找的东西。然而,我没有看到一个方法可以被调用来返回这个属性。

python tensorflow tensor operation
1个回答
0
投票

从你的代码来看,我认为你使用的是tensorflow v<2.所以,不知道这是否能解决你的问题,但我可以使用v2.2.0创建 adj.list和 adj.mat格式。

split是用来解析名字的,如下所示 回答

邻接矩阵生成。

# adjacency matrix
# if operation input is node1 and output is node2, then mat[node1][node2] = 1
graph_adj_mat = [] 
# name to number mapping to set 1/0 from the node name tensorflow gives
graph_node_name_to_num_map = {}
# node number to name map will be needed later to understand matrix
# as tensorflow identify node using name
graph_node_num_to_name_map = {}


# usage of compat module to use Session in v2.2.0
# if v < 2 use tf.Session() as sess
with tf.compat.v1.Session() as sess:
    # initiating the matrix and necessary map
    for op in sess.graph.get_operations():
        graph_node_num_to_name_map[len(graph_adj_mat)] = op.name
        graph_node_name_to_num_map[op.name] = len(graph_adj_mat)
        graph_adj_mat.append([0]*len(sess.graph.get_operations()))

    # parsing the name and setting adj. mat
    # edge direction input tensor to output tensor
    for op in sess.graph.get_operations():
        dst_node_name  = op.name.split(':')[0]
        for in_tensor in op.inputs:
            src_node_name  = in_tensor.name.split(':')[0]
            graph_adj_mat[graph_node_name_to_num_map[src_node_name]][graph_node_name_to_num_map[dst_node_name]] = 1


print(graph_adj_mat)
print(graph_node_num_to_name_map)

邻接列表的生成(使用dict)。

# adjacency list is dictionary of tensor name, 
# each input tensor name key holds output tensor name containing list
graph_adj_list = {}
with tf.compat.v1.Session() as sess:
    for op in sess.graph.get_operations():
        graph_adj_list[op.name] = []

    for op in sess.graph.get_operations():
        dst_node_name  = op.name.split(':')[0]
        for in_tensor in op.inputs:
            src_node_name  = in_tensor.name.split(':')[0]
            graph_adj_list[src_node_name].append(dst_node_name)

# graph_adj_list[in_tensor_name] contains list containing tensor names which are produced using in_tensor_name
print(graph_adj_list)

用给定代码的修改版本测试输出。

import tensorflow as tf

print(tf.__version__)

tf.compat.v1.disable_eager_execution()
tf.compat.v1.reset_default_graph()

a = tf.constant(1.3, name = 'const_a')
b = tf.constant(3.1, name = 'const_b')
c = tf.add(a,b, name = 'addition')
d = tf.multiply(c,a, name = 'multiplication')
e = tf.add(d,c, name = 'addition_1')
© www.soinside.com 2019 - 2024. All rights reserved.