从我到目前为止收集到的信息来看,有几种不同的方法可以将 TensorFlow 图转储到文件中,然后将其加载到另一个程序中,但我还没有找到关于它们如何工作的明确示例/信息。我已经知道的是:
- 使用以下命令将模型的变量保存到检查点文件 (.ckpt) 中
tf.train.Saver()
并稍后恢复它们(source https://www.tensorflow.org/versions/r0.10/how_tos/variables/index.html)
- 将模型保存到 .pb 文件中并使用时将其加载回来
tf.train.write_graph()
and tf.import_graph_def()
(source https://github.com/tensorflow/tensorflow/issues/616)
- 从 .pb 文件加载模型,重新训练它,然后使用 Bazel 将其转储到新的 .pb 文件中(source https://petewarden.com/2016/02/28/tensorflow-for-poets/)
- 冻结图形以将图形和权重保存在一起(source https://www.tensorflow.org/versions/r0.9/how_tos/tool_developers/index.html#freezing)
- Use
as_graph_def()
保存模型,对于权重/变量,将它们映射到常量(source https://stackoverflow.com/questions/34343259/is-there-an-example-on-how-to-generate-protobuf-files-holding-trained-tensorflow)
但是,我无法澄清有关这些不同方法的几个问题:
- 关于检查点文件,它们只保存模型的训练权重吗?检查点文件是否可以加载到新程序中,并用于运行模型,或者它们只是作为在特定时间/阶段保存模型中的权重的方法?
- 关于
tf.train.write_graph()
,权重/变量是否也被保存?
- 关于 Bazel,它只能保存到 .pb 文件中/从 .pb 文件中加载以进行重新训练吗?是否有一个简单的 Bazel 命令可以将图形转储到 .pb 中?
- 关于冻结,可以使用以下方式加载冻结图吗
tf.import_graph_def()
?
- TensorFlow 的 Android 演示从 .pb 文件加载到 Google 的 Inception 模型中。如果我想替换我自己的 .pb 文件,我该怎么做?我需要更改任何本机代码/方法吗?
- 一般来说,所有这些方法之间到底有什么区别?或者更广泛地说,两者之间有什么区别
as_graph_def()
/.ckpt/.pb?
简而言之,我正在寻找一种将图形(例如各种操作等)及其权重/变量保存到文件中的方法,然后可以使用该方法将图形和权重加载到另一个程序中,供使用(不一定是继续/再培训)。
有关此主题的文档不是很简单,因此我们将不胜感激任何答案/信息。
有很多方法可以解决在 TensorFlow 中保存模型的问题,这可能会让人有点困惑。依次回答每个子问题:
检查点文件(例如通过调用生成saver.save() https://www.tensorflow.org/api_docs/python/tf/train/Saver#save on a tf.train.Saver https://www.tensorflow.org/api_docs/python/tf/train/Saver对象)仅包含权重以及同一程序中定义的任何其他变量。要在另一个程序中使用它们,您必须重新创建关联的图形结构(例如,通过运行代码来再次构建它,或者调用tf.import_graph_def() https://www.tensorflow.org/api_docs/python/tf/import_graph_def),它告诉 TensorFlow 如何处理这些权重。请注意,调用saver.save()
还生成一个文件,其中包含MetaGraphDef https://www.tensorflow.org/api_guides/python/meta_graph,其中包含一个图表以及如何将检查点的权重与该图表关联的详细信息。看教程 https://www.tensorflow.org/api_guides/python/meta_graph更多细节。
tf.train.write_graph() https://www.tensorflow.org/api_docs/python/tf/train/write_graph只写图结构;不是重量。
Bazel 与阅读或编写 TensorFlow 图无关。 (也许我误解了你的问题:请随时在评论中澄清。)
可以使用以下方式加载冻结图tf.import_graph_def() https://www.tensorflow.org/api_docs/python/tf/import_graph_def。在这种情况下,权重(通常)嵌入到图中,因此您不需要加载单独的检查点。
主要的变化是更新输入到模型中的张量的名称以及从模型中获取的张量的名称。在 TensorFlow Android 演示中,这对应于inputName
and outputName
传递给的字符串TensorFlowClassifier.initializeTensorFlow() https://github.com/tensorflow/tensorflow/blob/d67ce6c449fabb3bebccd85815d9d291f114e6e4/tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowClassifier.java#L34.
The GraphDef
是程序结构,通常在训练过程中不会改变。检查点是训练过程状态的快照,通常在训练过程的每一步都会发生变化。因此,TensorFlow 对这些类型的数据使用不同的存储格式,并且低级 API 提供了不同的方法来保存和加载它们。更高级别的库,例如MetaGraphDef https://www.tensorflow.org/api_guides/python/meta_graph图书馆,Keras https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model, and skflow https://github.com/tensorflow/skflow#saving--restoring-models建立在这些机制的基础上,提供更方便的方法来保存和恢复整个模型。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)