欢迎访问宙启技术站
智能推送

training_util.write_graph()函数的源码分析与实现细节解读

发布时间:2024-01-06 12:48:52

training_util.write_graph()函数是tensorflow中的一个辅助函数,用于将计算图(Graph)保存到磁盘上。该函数的源码实现非常简单,下面是具体的源码分析和实现细节解读。

源码分析:

def write_graph(graph_or_graph_def, logdir, name, as_text=True):
  graph_def = graph_or_graph_def if isinstance(graph_or_graph_def, graph_pb2.GraphDef) else graph_or_graph_def.as_graph_def()
  if name:  # If name is provided, use it instead of the graph's name.
    filename = name
  else:
    filename = ops.Graph().unique_name('graph')
  filename += '_pb'
  path = os.path.join(logdir, filename)
  
  if as_text:
    path += '.txt'
    with tf.io.gfile.GFile(path, 'wb') as f:
      f.write(str(graph_def))
  else:
    path += '.pb'
    with tf.io.gfile.GFile(path, 'wb') as f:
      f.write(graph_def.SerializeToString()) 
  return path

实现细节解读:

- 该函数有4个参数,graph_or_graph_def表示要保存的计算图(Graph),logdir表示保存的目录路径,name表示保存的文件名,as_text表示是否以文本形式保存。

- 首先,函数会判断graph_or_graph_def的类型,如果是GraphDef类型,则直接将它赋值给graph_def;否则,将其转换为GraphDef类型,并赋值给graph_def。

- 接着,根据传入的name参数,决定保存的文件名。如果提供了name参数,则直接使用该参数作为文件名;否则,会使用默认的名字,ops.Graph().unique_name('graph')会生成一个唯一的名字作为文件名。

- 之后,根据传入的as_text参数,决定保存的文件格式。如果as_text为True,则将文件后缀名设置为".txt",以文本形式保存计算图;否则,将文件后缀名设置为".pb",以二进制形式保存计算图。

- 最后,将保存的文件名与目录路径进行拼接,保存到磁盘上。如果以文本形式保存,通过tf.io.gfile.GFile打开文件,并将graph_def转换为字符串写入文件;如果以二进制形式保存,通过tf.io.gfile.GFile打开文件,并将graph_def序列化为字符串后写入文件。

- 函数返回保存到磁盘上的文件的路径。

使用例子:

假设我们有以下计算图:

import tensorflow as tf

# 定义计算图
a = tf.constant(1.0, name='a')
b = tf.constant(2.0, name='b')
c = a + b

# 保存计算图
tf.compat.v1.train.write_graph(tf.compat.v1.get_default_graph().as_graph_def(), '', 'graph', as_text=False)

上面的代码创建了一个简单的计算图,其中包含两个常量节点和一个加法节点。然后,使用write_graph()函数将该计算图保存到磁盘上,文件名为'graph',保存格式为二进制。

目录结构:
├── graph.pb

从上面的目录结构可以看出,write_graph()函数生成了一个名为'graph.pb'的文件,保存了计算图的二进制形式。