training_util.write_graph()函数的源码分析与实现细节解读
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'的文件,保存了计算图的二进制形式。
