TensorFlow保存/从fi加载图形

2024-04-25 02:24:20 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  1. 使用tf.train.Saver()将模型变量保存到检查点文件(.ckpt)中,并在以后还原它们(source
  2. 将模型保存到.pb文件中,并使用tf.train.write_graph()tf.import_graph_def()source)将其加载回中
  3. 从一个.pb文件加载一个模型,重新编译它,并使用Bazel(source)将其转储到一个新的.pb文件中
  4. 冻结图形以将图形和权重一起保存(source
  5. 使用as_graph_def()保存模型,对于权重/变量,将它们映射为常量(source

但是,关于这些不同的方法,我还没有弄清楚几个问题:

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

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

关于这个主题的文档不是很简单,所以任何答案/信息都会非常感谢。


Tags: 文件方法模型程序信息图形sourcetf
2条回答

您可以尝试以下代码:

with tf.gfile.FastGFile('model/frozen_inference_graph.pb', "rb") as f:
    graph_def = tf.GraphDef()
    graph_def.ParseFromString(f.read())
    g_in = tf.import_graph_def(graph_def, name="")
sess = tf.Session(graph=g_in)

在TensorFlow中保存模型的方法有很多,这会使模型有点混乱。依次回答每个子问题:

  1. 检查点文件(例如通过调用^{}对象上的^{}生成)仅包含权重和同一程序中定义的任何其他变量。要在另一个程序中使用它们,必须重新创建关联的图结构(例如,通过运行代码重新构建它,或者调用^{}),它告诉TensorFlow如何处理这些权重。请注意,调用saver.save()还会生成一个包含^{}的文件,其中包含一个图形以及如何将检查点的权重与该图形关联的详细信息。有关详细信息,请参见the tutorial

  2. ^{}只写图形结构;不写权重。

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

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

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

  6. GraphDef是程序结构,通常在训练过程中不会改变。检查点是训练过程状态的快照,通常在训练过程的每一步都会更改。因此,TensorFlow对这些类型的数据使用不同的存储格式,低级API提供了不同的保存和加载方式。更高级别的库(如^{}库、Kerasskflow)基于这些机制构建,以提供更方便的方法来保存和恢复整个模型。

相关问题 更多 >