<p>在TensorFlow中保存模型的方法有很多,这会使模型有点混乱。依次回答每个子问题:</p>
<ol>
<li><p>检查点文件(例如通过调用<a href="https://www.tensorflow.org/api_docs/python/tf/train/Saver" rel="noreferrer">^{<cd2>}</a>对象上的<a href="https://www.tensorflow.org/api_docs/python/tf/train/Saver#save" rel="noreferrer">^{<cd1>}</a>生成)仅包含权重和同一程序中定义的任何其他变量。要在另一个程序中使用它们,必须重新创建关联的图结构(例如,通过运行代码重新构建它,或者调用<a href="https://www.tensorflow.org/api_docs/python/tf/import_graph_def" rel="noreferrer">^{<cd3>}</a>),它告诉TensorFlow如何处理这些权重。请注意,调用<code>saver.save()</code>还会生成一个包含<a href="https://www.tensorflow.org/api_guides/python/meta_graph" rel="noreferrer">^{<cd5>}</a>的文件,其中包含一个图形以及如何将检查点的权重与该图形关联的详细信息。有关详细信息,请参见<a href="https://www.tensorflow.org/api_guides/python/meta_graph" rel="noreferrer">the tutorial</a>。</p></li>
<li><p><a href="https://www.tensorflow.org/api_docs/python/tf/train/write_graph" rel="noreferrer">^{<cd6>}</a>只写图形结构;不写权重。</p></li>
<li><p>Bazel与读写TensorFlow图无关。(也许我误解了你的问题:请在评论中澄清。)</li>
<li><p>可以使用<a href="https://www.tensorflow.org/api_docs/python/tf/import_graph_def" rel="noreferrer">^{<cd3>}</a>加载冻结图。在这种情况下,权重(通常)嵌入到图中,因此不需要加载单独的检查点。</p></li>
<li><p>主要的变化是更新输入到模型中的张量的名称,以及从模型中获取的张量的名称。在TensorFlow Android演示中,这将对应于传递给<a href="https://github.com/tensorflow/tensorflow/blob/d67ce6c449fabb3bebccd85815d9d291f114e6e4/tensorflow/examples/android/src/org/tensorflow/demo/TensorFlowClassifier.java#L34" rel="noreferrer">^{<cd10>}</a>的<code>inputName</code>和<code>outputName</code>字符串。</p></li>
<li><p><code>GraphDef</code>是程序结构,通常在训练过程中不会改变。检查点是训练过程状态的快照,通常在训练过程的每一步都会更改。因此,TensorFlow对这些类型的数据使用不同的存储格式,低级API提供了不同的保存和加载方式。更高级别的库(如<a href="https://www.tensorflow.org/api_guides/python/meta_graph" rel="noreferrer">^{<cd5>}</a>库、<a href="https://keras.io/getting-started/faq/#how-can-i-save-a-keras-model" rel="noreferrer">Keras</a>和<a href="https://github.com/tensorflow/skflow#saving--restoring-models" rel="noreferrer">skflow</a>)基于这些机制构建,以提供更方便的方法来保存和恢复整个模型。</p></li>
</ol>