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