TensorFlow从文件中保存/加载graphics

从目前为止,我们已经有几种不同的方法将TensorFlow图转储到一个文件中,然后将其加载到另一个程序中,但是我一直无法find有关它们工作原理的明确示例/信息。 我已经知道的是这样的:

  1. 使用tf.train.Saver()将模型的variables保存到检查点文件(.ckpt tf.train.Saver() ,稍后恢复( 源文件 )
  2. 将模型保存到.pb文件中,并使用tf.train.write_graph()tf.import_graph_def() ( source )将其加载回来。
  3. 从.pb文件加载模型,重新训练,并使用Bazel( 源代码 )将其转储到新的.pb文件中
  4. 冻结graphics以保存graphics和权重( 来源 )
  5. 使用as_graph_def()保存模型,对于权重/variables,将它们映射到常量( 源 )

但是,我还没有能够澄清这些不同方法的几个问题:

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

总之,我正在寻找的是一种方法来保存一个graphics(如,各种操作等)及其权重/variables到一个文件,然后可以用来加载graphics和权重到另一个程序,供使用(不一定是继续/再培训)。

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

在TensorFlow中有很多方法可以解决保存模型的问题,这可能会导致混乱。 依次分析你的每一个子问题:

  1. 检查点文件(例如,通过在tf.train.Saver对象上调用saver.save() tf.train.Saver )仅包含权重以及在同一程序中定义的任何其他variables。 要在另一个程序中使用它们,必须重新创build关联的graphics结构(例如通过运行代码来重新构build它,或者调用tf.import_graph_def() ),它告诉TensorFlow如何处理这些权重。 请注意,调用saver.save()还会生成一个包含MetaGraphDef的文件,该文件包含一个graphics以及如何将检查点的权重与该graphics相关联的详细信息。 请参阅教程了解更多详情。

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

  3. Bazel与阅读或编写TensorFlow图表无关。 (也许我误解了你的问题:请在评论中澄清它。)

  4. 冻结图可以使用tf.import_graph_def()加载。 在这种情况下,权重(通常)embedded在图中,因此不需要加载单独的检查点。

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

  6. GraphDef是程序结构,通常在训练过程中不会改变。 检查点是训练过程状态的快照,通常在训练过程的每一步都会改变。 因此,TensorFlow针对这些types的数据使用不同的存储格式,而低级API提供了不同的方式来保存和加载它们。 较高级别的库,如MetaGraphDef库, MetaGraphDef和skflowbuild立在这些机制上,以提供更方便的方式来保存和恢复整个模型。