TensorFlow从文件中保存/加载graphics
从目前为止,我们已经有几种不同的方法将TensorFlow图转储到一个文件中,然后将其加载到另一个程序中,但是我一直无法find有关它们工作原理的明确示例/信息。 我已经知道的是这样的:
- 使用
tf.train.Saver()
将模型的variables保存到检查点文件(.ckpttf.train.Saver()
,稍后恢复( 源文件 ) - 将模型保存到.pb文件中,并使用
tf.train.write_graph()
和tf.import_graph_def()
( source )将其加载回来。 - 从.pb文件加载模型,重新训练,并使用Bazel( 源代码 )将其转储到新的.pb文件中
- 冻结graphics以保存graphics和权重( 来源 )
- 使用
as_graph_def()
保存模型,对于权重/variables,将它们映射到常量( 源 )
但是,我还没有能够澄清这些不同方法的几个问题:
- 关于检查点文件,他们是否只保存模型的训练重量? 检查点文件可以加载到一个新的程序,并用于运行模型,或者他们只是作为方式来保存模型中的权重在某个时间/阶段?
- 关于
tf.train.write_graph()
,还保存了权重/variables吗? - 关于Bazel,它只能保存到/从.pb文件加载再培训? 有一个简单的Bazel命令只是将图转储到.pb中吗?
- 关于冻结,可以使用
tf.import_graph_def()
来加载冻结图吗? - TensorFlow的Android演示从.pb文件加载到Google的Inception模型中。 如果我想replace自己的.pb文件,我该如何去做呢? 我需要更改任何本机代码/方法吗?
- 一般来说,所有这些方法之间究竟有什么区别呢? 或者更广泛地说,
as_graph_def()
ckpt/.pb有什么区别?
总之,我正在寻找的是一种方法来保存一个graphics(如,各种操作等)及其权重/variables到一个文件,然后可以用来加载graphics和权重到另一个程序,供使用(不一定是继续/再培训)。
有关这个主题的文档不是很简单,所以任何答案/信息将不胜感激。
在TensorFlow中有很多方法可以解决保存模型的问题,这可能会导致混乱。 依次分析你的每一个子问题:
-
检查点文件(例如,通过在
tf.train.Saver
对象上调用saver.save()
tf.train.Saver
)仅包含权重以及在同一程序中定义的任何其他variables。 要在另一个程序中使用它们,必须重新创build关联的graphics结构(例如通过运行代码来重新构build它,或者调用tf.import_graph_def()
),它告诉TensorFlow如何处理这些权重。 请注意,调用saver.save()
还会生成一个包含MetaGraphDef
的文件,该文件包含一个graphics以及如何将检查点的权重与该graphics相关联的详细信息。 请参阅教程了解更多详情。 -
tf.train.write_graph()
只写图结构; 不是重量。 -
Bazel与阅读或编写TensorFlow图表无关。 (也许我误解了你的问题:请在评论中澄清它。)
-
冻结图可以使用
tf.import_graph_def()
加载。 在这种情况下,权重(通常)embedded在图中,因此不需要加载单独的检查点。 -
主要的变化是更新input到模型中的张量的名称,以及从模型中提取的张量的名称。 在TensorFlow Android演示中,这将对应于传递给
TensorFlowClassifier.initializeTensorFlow()
的inputName
和outputName
string。 -
GraphDef
是程序结构,通常在训练过程中不会改变。 检查点是训练过程状态的快照,通常在训练过程的每一步都会改变。 因此,TensorFlow针对这些types的数据使用不同的存储格式,而低级API提供了不同的方式来保存和加载它们。 较高级别的库,如MetaGraphDef
库,MetaGraphDef
和skflowbuild立在这些机制上,以提供更方便的方式来保存和恢复整个模型。