TensorFlow从文件保存到/加载图形

Tec*_*lor 93 python protocol-buffers tensorflow

从我到目前为止收集的内容来看,有几种不同的方法可以将TensorFlow图转储到文件中,然后将其加载到另一个程序中,但我无法找到有关它们如何工作的明确示例/信息.我已经知道的是:

  1. 使用a将模型的变量保存到检查点文件(.ckpt)中,tf.train.Saver()然后将其恢复(源代码)
  2. 将模型保存到.pb文件中并使用tf.train.write_graph()tf.import_graph_def()()加载回来
  3. 从.pb文件加载模型,重新训练并使用Bazel将其转储到新的.pb文件中(源代码)
  4. 冻结图形以将图形和权重保存在一起()
  5. 使用as_graph_def()保存模型,并为权重/变量,它们映射到常数()

但是,我无法澄清有关这些不同方法的几个问题:

  1. 关于检查点文件,他们只保存模型的训练权重吗?可以将检查点文件加载到新程序中,并用于运行模型,还是仅仅用作在特定时间/阶段将权重保存在模型中的方法?
  2. 关于tf.train.write_graph(),是否也保存了权重/变量?
  3. 关于Bazel,它是否只能从.pb文件中保存/加载以进行再培训?有一个简单的Bazel命令只是为了将图形转储到.pb中吗?
  4. 关于冻结,可以使用冻结图加载tf.import_graph_def()吗?
  5. TensorFlow的Android演示从.pb文件加载Google的Inception模型.如果我想替换我自己的.pb文件,我该怎么做呢?我需要更改任何本机代码/方法吗?
  6. 一般来说,所有这些方法之间究竟有什么区别?或者更广泛地说,/.as_graph_def()keeppt/.pb有什么区别?

简而言之,我正在寻找的方法是将图形(如,各种操作等)及其权重/变量保存到文件中,然后可以将其用于将图形和权重加载到另一个程序中,使用(不一定继续/再培训).

关于这个主题的文档不是很简单,所以任何答案/信息将不胜感激.

mrr*_*rry 78

有很多方法可以解决在TensorFlow中保存模型的问题,这可能会让它有点混乱.依次提出每个子问题:

  1. 检查点文件(例如产生通过调用saver.save()一个上tf.train.Saver对象)只包含的权重,并且在相同程序中定义的任何其它变量.要在另一个程序中使用它们,您必须重新创建关联的图形结构(例如,通过运行代码再次构建它或调用tf.import_graph_def()),它告诉TensorFlow如何处理这些权重.请注意,调用saver.save()还会生成一个包含a的文件MetaGraphDef,其中包含一个图表以及如何将检查点的权重与该图表相关联的详细信息.有关详细信息,请参阅教程.

  2. tf.train.write_graph()只写图结构; 不是重量.

  3. Bazel与读取或写入TensorFlow图形无关.(也许我误解了你的问题:随意在评论中澄清它.)

  4. 可以使用加载冻结图tf.import_graph_def().在这种情况下,权重(通常)嵌入到图形中,因此您无需加载单独的检查点.

  5. 主要的变化是更新输入到模型中的张量的名称,以及从模型中提取的张量的名称.在TensorFlow Android演示中,这将对应于传递给的字符串inputNameoutputName字符串TensorFlowClassifier.initializeTensorFlow().

  6. GraphDef是该程序的结构,其通常不通过训练过程而改变.检查点是培训过程状态的快照,通常在培训过程的每个步骤都会发生变化.因此,TensorFlow为这些类型的数据使用不同的存储格式,而低级API提供了不同的方法来保存和加载它们.更高级别的库,如MetaGraphDef图书馆,Kerasskflow建立在这些机制,提供更方便的方式来保存和恢复整个模型.

  • C++ API文档不存在,但缺少一些细节.最重要的细节是,除了`tf.train.write_graph()`保存的`GraphDef`之外,还需要记住在执行图形时要提供和提取的张量的名称(第5项)以上). (2认同)
  • @ Coderx7我真的认为你不能将.ckpt转换为.pb,因为检查点只包含权重和变量,并且对图的结构一无所知 (2认同)
  • 是否有一个简单的代码来加载 .pb 文件然后运行它? (2认同)