问题:TensorFlow保存到文件中/从文件中加载图形
根据到目前为止的经验,有几种不同的方法可以将TensorFlow图转储到文件中,然后再将其加载到另一个程序中,但是我无法找到关于它们如何工作的清晰示例/信息。我已经知道的是:
- 使用a将模型的变量保存到检查点文件(.ckpt)中,
tf.train.Saver()
并在以后还原它们(源) - 将模型保存到.pb文件,然后使用
tf.train.write_graph()
和tf.import_graph_def()
(source)将其加载回 - 从.pb文件加载模型,对其进行重新训练,然后使用Bazel将其转储到新的.pb文件中(源)
- 冻结图形以将图形和权重保存在一起(源)
- 使用
as_graph_def()
保存模型,并为权重/变量,它们映射到常数(源)
但是,我无法清除有关这些不同方法的几个问题:
- 关于检查点文件,它们仅保存模型的训练权重吗?是否可以将检查点文件加载到新程序中并用于运行模型,还是仅将它们用作在特定时间/阶段将权重保存在模型中的方法?
- 关于
tf.train.write_graph()
,权重/变量也被保存吗? - 关于Bazel,它只能保存到.pb文件中或从中加载以进行重新训练吗?是否有一个简单的Bazel命令只是将图形转储到.pb中?
- 关于冻结,是否可以使用来加载冻结图
tf.import_graph_def()
? - TensorFlow的Android演示从.pb文件加载到Google的Inception模型中。如果我想替换自己的.pb文件,该怎么做?我需要更改任何本机代码/方法吗?
- 通常,所有这些方法之间到底有什么区别?或更广泛地说,/。
as_graph_def()
ckpt / .pb有什么区别?
简而言之,我正在寻找一种将图形(如各种操作等)及其权重/变量都保存到文件中的方法,然后可以将其用于将图形和权重加载到另一个程序中,以供使用(不一定要继续/训练)。
关于此主题的文档不是很简单,因此,非常感谢您提供任何答案/信息。
回答 0
有很多方法可以解决在TensorFlow中保存模型的问题,这可能会使它有些混乱。依次处理您的每个子问题:
检查点文件(例如产生通过调用
一个上 对象)只包含的权重,并且在相同程序中定义的任何其它变量。要在另一个程序中使用它们,您必须重新创建关联的图形结构(例如,通过运行代码以再次构建它,或调用 ),这告诉TensorFlow如何处理这些权重。请注意,调用 saver.save()
还会生成一个包含的文件MetaGraphDef
,该文件包含一个图形以及如何将检查点的权重与该图形相关联的详细信息。有关更多详细信息,请参见教程。tf.train.write_graph()
只写图结构;不是重量。Bazel与读取或写入TensorFlow图无关。(也许我误会了您的问题:请随时在评论中予以澄清。)
冻结的图可以使用加载
tf.import_graph_def()
。在这种情况下,权重(通常)嵌入在图形中,因此您无需加载单独的检查点。主要更改将是更新输入到模型中的张量的名称以及从模型中获取的张量的名称。在TensorFlow Android演示中,这将与传递给的
inputName
和outputName
字符串相对应TensorFlowClassifier.initializeTensorFlow()
。的
GraphDef
是该程序的结构,其通常不通过训练过程而改变。检查点是训练过程状态的快照,通常在训练过程的每个步骤都会改变。结果,TensorFlow对这些类型的数据使用不同的存储格式,并且低级API提供了不同的方式来保存和加载它们。更高级别的库,如MetaGraphDef
图书馆,Keras和skflow对这些机制的构建提供更加便捷的方式来保存和恢复整个模型。
回答 1
您可以尝试以下代码:
with tf.gfile.FastGFile('model/frozen_inference_graph.pb', "rb") as f:
graph_def = tf.GraphDef()
graph_def.ParseFromString(f.read())
g_in = tf.import_graph_def(graph_def, name="")
sess = tf.Session(graph=g_in)