我正试图为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
有由操作产生的输入时序 addition
和 multiplication;
或可以用来推导这些信息的东西。从 文件看来 Operation
对象有一个名为 inputs
这可能是我正在寻找的东西。然而,我没有看到一个方法可以被调用来返回这个属性。
从你的代码来看,我认为你使用的是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')